Android 7.0 获取相机、相册

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




猜你喜欢

转载自blog.csdn.net/ff_hh/article/details/78180911