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) ; }



更多相关文章

  1. Android在代码中请求root权限
  2. Android(安卓)录音,加权限还有错误:java.lang.RuntimeException: s
  3. android 获得sdk路径
  4. cocos2d-x 3.X 在android 中添加多盟插屏广告
  5. Android(安卓)数据存储与IO (二)
  6. Android的权限
  7. android默认允许usb调试和usb权限
  8. Android文章目录
  9. android 权限集合

随机推荐

  1. 深入解析MS-SQL锁机制
  2. Replace关键字的妙用查询是否包含某个特
  3. SQL Server优化50法汇总
  4. 执行一条sql语句update多条记录实现思路
  5. DDL、DML和DCL的区别与理解
  6. 清除SQL SERVER错误日志出现操作系统错误
  7. SQL Server存储过程入门学习
  8. 如何控制SQLServer中的跟踪标记
  9. MSSQL 监控数据/日志文件增长实现方法
  10. MSSQL监控数据库的DDL操作(创建,修改,删除