//需要的权限数组 读/写/相机
private static String[] PERMISSIONS_STORAGE = {android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
// 头像
private ImageView imageView;
private String imgUrl;
// 初始化时,绑定控件
imageView = findViewById(R.id.imageView);
// 点击事件,底部弹出框
ActionSheetDialog dialog = new ActionSheetDialog(getActivity()).builder().setCancelable(false).setTitle("请选择")
.addSheetItem("相册", null, which -> {
//选择照片按钮
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 100);
}).addSheetItem("拍照", null, which -> {
//检查是否已经获得相机的权限
if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[2]) == 0) {
Log.e("", "提示是否要授权");
ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);
} else if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[1]) == 0) {
Log.e("", "提示是否要授权");
ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);
} else if (verifyPermissions(getActivity(), PERMISSIONS_STORAGE[0]) == 0) {
Log.e("", "提示是否要授权");
ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, 3);
} else {
//已经有权限,打开相机
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent2, 200);
}
});
dialog.show();
/**
* 检查是否有对应权限
*
* @param activity 上下文
* @param permission 要检查的权限
* @return 结果标识
*/
public int verifyPermissions(Activity activity, java.lang.String permission) {
int Permission = ActivityCompat.checkSelfPermission(activity, permission);
if (Permission == PackageManager.PERMISSION_GRANTED) {
Log.e("", "已经同意权限");
return 1;
} else {
Log.e("", "没有同意权限");
return 0;
}
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == RESULT_OK && data != null) {//系统相册
Uri imageData = data.getData();
String path = getPath(imageData);
Bitmap bitmap = BitmapFactory.decodeFile(path);
Bitmap bitmap1 = BitmapUtils.zoomBitmap(bitmap, imageView.getWidth(),imageView.getHeight());
Bitmap bitmap2 = BitmapUtils.createCircleBitmap(bitmap1, 0, false, 0, 0);
//加载显示
imageView.setImageBitmap(bitmap2);
// bitmap图片上传到服务器(写你自己的上传方法)
// bitmap图片保存到本地
saveImage(bitmap2);
} else if (requestCode == 200 && resultCode == RESULT_OK && data != null) {//系统相机
Bitmap photo = null;
Uri uri = data.getData();
if (uri != null) {
photo = BitmapFactory.decodeFile(uri.getPath());
}
if (photo == null) {
Bundle bundle = data.getExtras();
if (bundle != null) {
photo = (Bitmap) bundle.get("data");
} else {
// Tools.toast(Tools.getResString(R.string.LAN299));
return;
}
}
FileOutputStream fileOutputStream = null;
try {
// 获取 SD 卡根目录
String saveDir = context.getExternalFilesDir(null).getAbsolutePath() + "/meitian_photos";
// 新建目录
File dir = new File(saveDir);
if (!dir.exists()) dir.mkdir();
// 生成文件名
SimpleDateFormat t = new SimpleDateFormat("yyyyMMddssSSS");
String filename = "MT" + (t.format(new Date())) + ".jpg";
// 新建文件
File file = new File(saveDir, filename);
// 打开文件输出流
fileOutputStream = new FileOutputStream(file);
// 生成图片文件
photo.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
// 相片的完整路径
imgUrl = file.getPath();
Log.i("相册完整路径", imgUrl);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// bitmap图片上传到服务器(写你自己的上传方法)
// bitmap图片保存到本地
saveImage(photo);
}
}
private void saveImage(Bitmap bitmap) {
File filesDir;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = getActivity().getExternalFilesDir("");
} else {//手机内部存储
//路径:data/data/包名/files
filesDir = getActivity().getFilesDir();
}
FileOutputStream fos = null;
try {
File file = new File(filesDir, "icon.png");
fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//如果本地有,就不需要再去联网去请求
private boolean readImage() {
File filesDir;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 判断sd卡是否挂载
//路径1:storage/sdcard/Android/data/包名/files
filesDir = getActivity().getExternalFilesDir("");
} else {//手机内部存储
//路径:data/data/包名/files
filesDir = getActivity().getFilesDir();
}
File file = new File(filesDir, "icon.png");
if (file.exists()) {
//存储--->内存
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
imageView.setImageBitmap(bitmap);
return true;
}
return false;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private String getPath(Uri uri) {
int sdkVersion = Build.VERSION.SDK_INT;
//高于4.4.2的版本
if (sdkVersion >= 19) {
Log.e("TAG", "uri auth: " + uri.getAuthority());
if (isExternalStorageDocument(uri)) {
String docId = DocumentsContract.getDocumentId(uri);
String[] split = docId.split(":");
String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(getActivity(), contentUri, null, null);
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(getActivity(), contentUri, selection, selectionArgs);
} else if (isMedia(uri)) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor actualimagecursor = getActivity().managedQuery(uri, proj, null, null, null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
return actualimagecursor.getString(actual_image_column_index);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(getActivity(), uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* uri路径查询字段
*
* @param context
* @param uri
* @param selection
* @param selectionArgs
* @return
*/
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
private boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
public static boolean isMedia(Uri uri) {
return "media".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
11-18