核心代码
File file = new File(photoPath);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
//方法1:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, file.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM);
ContentResolver contentResolver = getContentResolver();
Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri == null) {
Log.i(tag,"url is null:");
return;
}
Log.i(tag,"uri is not null:"+uri.getPath());
try {
OutputStream outputStream = contentResolver.openOutputStream(uri);
FileInputStream fileInputStream = new FileInputStream(file);
FileUtils.copy(fileInputStream, outputStream);
fileInputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
//方法2:看的没啥问题 感觉回退回去了
//addMediaStore(MainActivity.this,file,file.getAbsolutePath());
} else {
//方式1
MediaScannerConnection.scanFile(
getApplicationContext(),
new String[]{file.getAbsolutePath()},
new String[]{"image/png"},
(path, uri) -> {
// Scan Completed
});
//方式2
//context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(targetFile)));
}
完整例子
package com.szw.phototest;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.provider.MediaStore;
import android.renderscript.ScriptGroup;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
public String tag = "szwsb";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button) findViewById(R.id.button1);
EditText editText = (EditText) findViewById(R.id.edit_text);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
editText.setText(getPath());
String inputText = editText.getText().toString();
shoot(MainActivity.this);
Toast tst = Toast.makeText(MainActivity.this, inputText, Toast.LENGTH_SHORT);
tst.show();
savePhotoAlbum(inputText);
//得到可用的图片
Bitmap bitmap = BitmapFactory.decodeFile(inputText);
ImageView imageView = findViewById(R.id.imageView);
if (bitmap ==null)
{
Log.i(tag,"bitmap is null");
}
//显示
imageView.setImageBitmap(bitmap);
}
});
}
private void savePhotoAlbum(String photoPath) {
File file = new File(photoPath);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
//方法1:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, file.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM);
ContentResolver contentResolver = getContentResolver();
Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri == null) {
Log.i(tag,"url is null:");
return;
}
Log.i(tag,"uri is not null:"+uri.getPath());
try {
OutputStream outputStream = contentResolver.openOutputStream(uri);
FileInputStream fileInputStream = new FileInputStream(file);
FileUtils.copy(fileInputStream, outputStream);
fileInputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
//方法2:看的没啥问题 感觉回退回去了
//addMediaStore(MainActivity.this,file,file.getAbsolutePath());
} else {
//方式1
MediaScannerConnection.scanFile(
getApplicationContext(),
new String[]{file.getAbsolutePath()},
new String[]{"image/png"},
(path, uri) -> {
// Scan Completed
});
//方式2
//context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(targetFile)));
}
}
public void addMediaStore(Context context, File targetFile, String mpath) {
方法2:看的没啥问题 感觉回退回去了
ContentResolver resolver = context.getContentResolver();
ContentValues newValues = new ContentValues(5);
newValues.put(MediaStore.Images.Media.DISPLAY_NAME, targetFile.getName());
newValues.put(MediaStore.Images.Media.DATA, targetFile.getPath());
newValues.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000);
newValues.put(MediaStore.Images.Media.SIZE, targetFile.length());
newValues.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
Uri muri= resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, newValues);
if (muri != null)
{
Log.i(tag,"uri is not null:"+muri.getPath());
}
}
static String newFilePath;
private static Bitmap takeScreenShot(Activity activity) {
// View是你需要截图的View
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
// 获取状态栏高度
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
Log.i("TAG", "" + statusBarHeight);
// 获取屏幕长和高
int width = 1080;
int height = 1080;
// activity.getWindowManager().getDefaultDisplay()
// .getHeight();
// 去掉标题栏
// Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
- statusBarHeight);
view.destroyDrawingCache();
return b;
}
// 保存到sdcard
private static void savePic(Bitmap b, String strFileName) {
FileOutputStream fos = null;
try {
//判断是否存在该文件夹和文件,如果没有新建
File file = new File(strFileName);
//获取父目录
File fileParent = file.getParentFile();
//判断是否存在
if (!fileParent.exists()) {
// 创建父目录文件
fileParent.mkdirs();
}
file.createNewFile();
fos = new FileOutputStream(new File(strFileName));
if (null != fos) {
b.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
}
Log.i("szwsb","savePic suck");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//用于获取当前最新的截图
public static String getPath(){
return newFilePath;
}
// 截屏方法
public static void shoot(Activity a) {
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String fileName = df.format(date)+".png";
//String sdCardPath = Environment.getExternalStorageDirectory().getPath();
String apath= a.getBaseContext().getExternalFilesDir( null ).getAbsolutePath();
//String sdCardPath = a.getBaseContext().getExternalFilesDir(null);
//String filePath = sdCardPath + File.separator + "xinlv" + File.separator + "Screenshoots"+ File.separator + fileName;
String filePath = apath + File.separator + "Screenshoots"+ File.separator + fileName;
newFilePath = filePath;
savePic(takeScreenShot(a), filePath);
}
}