清单文件加入权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
主要保存代码
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_STATE_CODE = 1010;
@BindView(R.id.txt_title)
TextView txtTitle;
@BindView(R.id.button)
Button button;
@BindView(R.id.lin_view)
LinearLayout linView;
private Bitmap mBitmap;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
txtTitle.setText("文章详情");
}
@OnClick(R.id.button)
public void onViewClicked() {
savePoster();
}
/**
* 保存海报图片
*/
private void savePoster() {
// 2.创建一个Bitmap
mBitmap = getBitmap(linView);
// 3.保存到SD卡
if (mBitmap != null) {
//判断是否为Android 6.0 以上的系统版本,如果是,需要动态添加权限
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions();
} else {
saveToLocal(mBitmap);
}
}
}
public Bitmap getBitmap(LinearLayout linearLayout) {
// 创建对应大小的bitmap
Bitmap bitmap = Bitmap.createBitmap(linearLayout.getMeasuredWidth(), linearLayout.getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
linearLayout.draw(canvas);
return createBitmap(bitmap, BitmapFactory.decodeResource(getResources(), R.mipmap.icon_logo));
}
//添加水印
private Bitmap createBitmap(Bitmap src, Bitmap watermark) {
if (src == null) {
return null;
}
int w = src.getWidth();
int h = src.getHeight();
int ww = watermark.getWidth();
int wh = watermark.getHeight();
//创建空白图像
Bitmap newb = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);//创建一个新的和SRC长度宽度一样的位图
Canvas cv = new Canvas(newb);
//画原图
cv.drawBitmap(src, 0, 0, null);//在 0,0坐标开始画入src
//在src的右下角画入水印
cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);
return newb;
}
private void requestPermissions() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, REQUEST_STATE_CODE);
} else {
saveToLocal(mBitmap);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_STATE_CODE:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
saveToLocal(mBitmap);
} else {
Toast.makeText(this, "权限授予失败,请重新授予", Toast.LENGTH_LONG).show();
return;
}
break;
default:
break;
}
}
/**
* 保存一张Bitmap图到本地
*/
private void saveToLocal(Bitmap bitmap) {
try {
File appDir = new File(Environment.getExternalStorageDirectory(), "Poster");
// 没有目录创建目录
if (!appDir.exists()) {
appDir.mkdir();
}
File file = new File(appDir, "image_" + System.currentTimeMillis() + ".jpg");
FileOutputStream out;
try {
out = new FileOutputStream(file);
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
out.close();
// 通知图库更新
Uri uri = Uri.fromFile(file);
Intent scannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(scannerIntent);
Toast.makeText(this, "保存图片到相册成功", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/main_bg"
android:orientation="vertical"
tools:context=".MainActivity">
<include layout="@layout/layout_title" />
<LinearLayout
android:id="@+id/lin_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/main_bg"
android:orientation="vertical"
android:paddingStart="10dp"
android:paddingEnd="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center"
android:text="标题"
android:textColor="#ff000000"
android:textSize="18dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="30dp"
android:text=" 阿克苏交付给独守空房独阿克苏交付给独守空房独守空房都是咖啡馆的空手道雕刻机萨风阿克苏交付给独守空房独守空房都是咖啡馆的空手道雕刻机萨风阿克苏交付给独守空房独守空房都是咖啡馆的空手道雕刻机萨风阿克苏交付给独守空房独守空房都是咖啡馆的空手道雕刻机萨风格就开始大幅观点雕刻机萨风格但是打开手机风格的跨境电商风格恐惧感第三方哈根达斯客户ADS格就开始大幅观点雕刻机萨风格但是打开手机风格的跨境电商风格恐惧感第三方哈根达斯客户ADS格就开始大幅观点雕刻机萨风格但是打开手机风格的跨境电商风格恐惧感第三方哈根达斯客户ADS格就开始大幅观点雕刻机萨风格但是打开手机风格的跨境电商风格恐惧感第三方哈根达斯客户ADS守空房都是咖啡馆的空手道雕刻机萨风格就开始大幅观点雕刻机萨风格但是打开手机风格的跨境电商风格恐惧感第三方哈根达斯客户ADS"
android:textColor="#ff000000"
android:textSize="12dp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="保存并添加水印" />
</LinearLayout>
</LinearLayout>