Android(安卓)7.0 获取相机、相册
16lz
2021-01-24
Android 获取相机 : 需要的的权限 Manfest.permission.WRITE_EXTERNAL_STORAGE 需要注意运行时权限 intent.addFlags(Intent. FLAG_GRANT_READ_URI_PERMISSION ) //增加读取 Uri 权限 以及 FileProvider 的使用 获取相册及相机方法
/** * 获取相机 已适配7.0 * * @param activity */ public synchronized void userCamera (Activity activity) { if (!EaseCommonUtils. isSdcardExist ()) { Toast. makeText (activity , R.string. sd_card_does_not_exist , Toast. LENGTH_SHORT ).show() ; return; } MyRequestPermission. getInstance (activity).setOnRequestPermissionListener(result -> { if (result) { camera( activity ) ; } else { Toast. makeText ( activity , "读取SD卡权限申请被拒,相机无法启动" , Toast. LENGTH_SHORT ).show() ; } }) ; boolean checkPermission = MyRequestPermission. getInstance (activity).isCheckPermission( new String[]{Manifest.permission. WRITE_EXTERNAL_STORAGE }) ; Observable observable = Observable. create (e -> e.onNext( checkPermission )) ; observable.filter(aBoolean -> { if (!aBoolean) Toast. makeText ( activity , "读取SD卡权限申请被拒,相机无法启动" , Toast. LENGTH_SHORT ).show() ; return aBoolean ; }).subscribe(aBoolean -> camera( activity )) ;
}
private void camera (Activity activity) { Intent intent = new Intent(MediaStore. ACTION_IMAGE_CAPTURE ) ; file = new File(Environment. getExternalStorageDirectory ().getAbsolutePath() + "/test/" + System. currentTimeMillis () + ".jpg" ) ; file .getParentFile().mkdirs() ; Uri uriForFile = FileProvider. getUriForFile (activity , "com.tiancai.tcggsc.fileprovider" , file ) ; intent.addFlags(Intent. FLAG_GRANT_READ_URI_PERMISSION ) //增加读取 Uri 权限 .putExtra(MediaStore. EXTRA_OUTPUT , uriForFile) ; activity.startActivityForResult(intent , Constant. REQUEST_CAMERA ) ; }
/** * 打开相册 * @param activity 当前activity */ public void openPic (Activity activity) { if (!EaseCommonUtils. isSdcardExist ()) {//是否存在SD卡 Toast. makeText (activity , R.string. sd_card_does_not_exist , Toast. LENGTH_SHORT ).show() ; return; } MyRequestPermission. getInstance (activity).setOnRequestPermissionListener(result -> { if (result) { openPicture( activity ) ; } else { Toast. makeText ( activity , "读取SD卡权限申请被拒,无法打开相册" , Toast. LENGTH_SHORT ).show() ; } }) ; boolean checkPermission = MyRequestPermission. getInstance (activity).isCheckPermission( new String[]{Manifest.permission. WRITE_EXTERNAL_STORAGE }) ; Observable observable = Observable. create (e -> e.onNext( checkPermission )) ; observable.filter(aBoolean -> { if (!aBoolean) Toast. makeText ( activity , "读取SD卡权限申请被拒,无法打开相册" , Toast. LENGTH_SHORT ).show() ; return aBoolean ; }).subscribe(aBoolean -> openPicture( activity )) ;
}
private void openPicture (Activity activity){ Intent photoPickerIntent = new Intent(Intent. ACTION_PICK , android.provider.MediaStore.Images.Media. EXTERNAL_CONTENT_URI ) ; photoPickerIntent.setAction(Intent. ACTION_GET_CONTENT ) ; photoPickerIntent.setType( "image/*" ) ; activity.startActivityForResult(photoPickerIntent , Constant. REQUEST_PHOTO_ALBUM ) ; }
activity 方法
@Override public void onRequestPermissionsResult ( int requestCode , @android.support.annotation.NonNull String[] permissions , @android.support.annotation.NonNull int [] grantResults) { super .onRequestPermissionsResult(requestCode , permissions , grantResults) ; MyRequestPermission. getInstance ( this ).onRequestPermissionsResult(requestCode , permissions , grantResults) ; }
@Override protected void onActivityResult ( int requestCode , int resultCode , Intent data) { super .onActivityResult(requestCode , resultCode , data) ; if (resultCode == RESULT_OK ) { switch (requestCode) { case Constant. REQUEST_CAMERA : File file = FileUtil. getInstance ().getFile() ; imgSetUserIcon .setImageURI(Uri. fromFile (file)) ; //在手机相册中显示刚拍摄的图片 Intent mediaScanIntent = new Intent(Intent. ACTION_MEDIA_SCANNER_SCAN_FILE ) ; Uri contentUri = Uri. fromFile (file) ; mediaScanIntent.setData(contentUri) ; sendBroadcast(mediaScanIntent) ; break; case Constant. REQUEST_PHOTO_ALBUM : // if (Build.VERSION. SDK_INT >= 19 ) {//注意4.4读取图片路径 不相同 handleImageOnKitKat(data) ; } else { handleImageBeforeKitKat(data) ; } break; }
} }
@RequiresApi ( api = Build.VERSION_CODES. KITKAT ) private void handleImageOnKitKat (Intent data) { String imagePath = null; Uri uri = data.getData() ; if (DocumentsContract. isDocumentUri ( this, uri)) { String docId = DocumentsContract. getDocumentId (uri) ; if ( "com.android.providers.media.documents" .equals(uri.getAuthority())) { String id = docId.split( ":" )[ 1 ] ; String selection = MediaStore.Images.Media. _ID + "=" + id ; imagePath = getImagePath(MediaStore.Images.Media. EXTERNAL_CONTENT_URI , selection) ; } else if ( "com.android.provider.downloads.documents" .equals(uri.getAuthority())) { Uri contentUri = ContentUris. withAppendedId (Uri. parse ( "content://downloads/public_downloads" ) , Long. valueOf (docId)) ; imagePath = getImagePath(contentUri , null ) ; } } else if ( "content" .equalsIgnoreCase(uri.getScheme())) { imagePath = getImagePath(uri , null ) ; } else if ( "file" .equalsIgnoreCase(uri.getScheme())) { imagePath = uri.getPath() ; } displayImage(imagePath) ; }
private void handleImageBeforeKitKat (Intent data) { String imagePath = null; Uri uri = data.getData() ; imagePath = getImagePath(uri , null ) ; displayImage(imagePath) ; }
// getImagePath的实现: private String getImagePath (Uri uri , String selection) { String Path = null; Cursor cursor = getContentResolver().query(uri , null, selection , null, null ) ; if (cursor != null ) { if (cursor.moveToFirst()) { Path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media. DATA )) ; } cursor.close() ; } return Path ; }
// displayImage的实现: private void displayImage (String Path) { Bitmap bm = BitmapFactory. decodeFile (Path) ; imgSetUserIcon .setImageBitmap(bm) ; }
/** * 获取相机 已适配7.0 * * @param activity */ public synchronized void userCamera (Activity activity) { if (!EaseCommonUtils. isSdcardExist ()) { Toast. makeText (activity , R.string. sd_card_does_not_exist , Toast. LENGTH_SHORT ).show() ; return; } MyRequestPermission. getInstance (activity).setOnRequestPermissionListener(result -> { if (result) { camera( activity ) ; } else { Toast. makeText ( activity , "读取SD卡权限申请被拒,相机无法启动" , Toast. LENGTH_SHORT ).show() ; } }) ; boolean checkPermission = MyRequestPermission. getInstance (activity).isCheckPermission( new String[]{Manifest.permission. WRITE_EXTERNAL_STORAGE }) ; Observable
}
private void camera (Activity activity) { Intent intent = new Intent(MediaStore. ACTION_IMAGE_CAPTURE ) ; file = new File(Environment. getExternalStorageDirectory ().getAbsolutePath() + "/test/" + System. currentTimeMillis () + ".jpg" ) ; file .getParentFile().mkdirs() ; Uri uriForFile = FileProvider. getUriForFile (activity , "com.tiancai.tcggsc.fileprovider" , file ) ; intent.addFlags(Intent. FLAG_GRANT_READ_URI_PERMISSION ) //增加读取 Uri 权限 .putExtra(MediaStore. EXTRA_OUTPUT , uriForFile) ; activity.startActivityForResult(intent , Constant. REQUEST_CAMERA ) ; }
/** * 打开相册 * @param activity 当前activity */ public void openPic (Activity activity) { if (!EaseCommonUtils. isSdcardExist ()) {//是否存在SD卡 Toast. makeText (activity , R.string. sd_card_does_not_exist , Toast. LENGTH_SHORT ).show() ; return; } MyRequestPermission. getInstance (activity).setOnRequestPermissionListener(result -> { if (result) { openPicture( activity ) ; } else { Toast. makeText ( activity , "读取SD卡权限申请被拒,无法打开相册" , Toast. LENGTH_SHORT ).show() ; } }) ; boolean checkPermission = MyRequestPermission. getInstance (activity).isCheckPermission( new String[]{Manifest.permission. WRITE_EXTERNAL_STORAGE }) ; Observable
}
private void openPicture (Activity activity){ Intent photoPickerIntent = new Intent(Intent. ACTION_PICK , android.provider.MediaStore.Images.Media. EXTERNAL_CONTENT_URI ) ; photoPickerIntent.setAction(Intent. ACTION_GET_CONTENT ) ; photoPickerIntent.setType( "image/*" ) ; activity.startActivityForResult(photoPickerIntent , Constant. REQUEST_PHOTO_ALBUM ) ; }
activity 方法
@Override public void onRequestPermissionsResult ( int requestCode , @android.support.annotation.NonNull String[] permissions , @android.support.annotation.NonNull int [] grantResults) { super .onRequestPermissionsResult(requestCode , permissions , grantResults) ; MyRequestPermission. getInstance ( this ).onRequestPermissionsResult(requestCode , permissions , grantResults) ; }
@Override protected void onActivityResult ( int requestCode , int resultCode , Intent data) { super .onActivityResult(requestCode , resultCode , data) ; if (resultCode == RESULT_OK ) { switch (requestCode) { case Constant. REQUEST_CAMERA : File file = FileUtil. getInstance ().getFile() ; imgSetUserIcon .setImageURI(Uri. fromFile (file)) ; //在手机相册中显示刚拍摄的图片 Intent mediaScanIntent = new Intent(Intent. ACTION_MEDIA_SCANNER_SCAN_FILE ) ; Uri contentUri = Uri. fromFile (file) ; mediaScanIntent.setData(contentUri) ; sendBroadcast(mediaScanIntent) ; break; case Constant. REQUEST_PHOTO_ALBUM : // if (Build.VERSION. SDK_INT >= 19 ) {//注意4.4读取图片路径 不相同 handleImageOnKitKat(data) ; } else { handleImageBeforeKitKat(data) ; } break; }
} }
@RequiresApi ( api = Build.VERSION_CODES. KITKAT ) private void handleImageOnKitKat (Intent data) { String imagePath = null; Uri uri = data.getData() ; if (DocumentsContract. isDocumentUri ( this, uri)) { String docId = DocumentsContract. getDocumentId (uri) ; if ( "com.android.providers.media.documents" .equals(uri.getAuthority())) { String id = docId.split( ":" )[ 1 ] ; String selection = MediaStore.Images.Media. _ID + "=" + id ; imagePath = getImagePath(MediaStore.Images.Media. EXTERNAL_CONTENT_URI , selection) ; } else if ( "com.android.provider.downloads.documents" .equals(uri.getAuthority())) { Uri contentUri = ContentUris. withAppendedId (Uri. parse ( "content://downloads/public_downloads" ) , Long. valueOf (docId)) ; imagePath = getImagePath(contentUri , null ) ; } } else if ( "content" .equalsIgnoreCase(uri.getScheme())) { imagePath = getImagePath(uri , null ) ; } else if ( "file" .equalsIgnoreCase(uri.getScheme())) { imagePath = uri.getPath() ; } displayImage(imagePath) ; }
private void handleImageBeforeKitKat (Intent data) { String imagePath = null; Uri uri = data.getData() ; imagePath = getImagePath(uri , null ) ; displayImage(imagePath) ; }
// getImagePath的实现: private String getImagePath (Uri uri , String selection) { String Path = null; Cursor cursor = getContentResolver().query(uri , null, selection , null, null ) ; if (cursor != null ) { if (cursor.moveToFirst()) { Path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media. DATA )) ; } cursor.close() ; } return Path ; }
// displayImage的实现: private void displayImage (String Path) { Bitmap bm = BitmapFactory. decodeFile (Path) ; imgSetUserIcon .setImageBitmap(bm) ; }
更多相关文章
- Android在代码中请求root权限
- Android(安卓)录音,加权限还有错误:java.lang.RuntimeException: s
- android 获得sdk路径
- cocos2d-x 3.X 在android 中添加多盟插屏广告
- Android(安卓)数据存储与IO (二)
- Android的权限
- android默认允许usb调试和usb权限
- Android文章目录
- android 权限集合