国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

MVP模式的Android 調用系統拍照,相冊,剪裁,適配到7.0,修復拍照圖片旋轉問題

2019-11-06 09:43:54
字體:
來源:轉載
供稿:網友

Android 調用系統拍照,相冊,剪裁,適配到7.0,修復拍照圖片旋轉問題

直接上代碼

首先添加拍照需要的權限

<uses-permission android:name="android.permission.CAMERA" />//相機權限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//寫SD<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />//讀SD<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTE" />

使用的常量

public static final int MY_PERMISSIONS_REQUEST_CAMERA = 100;//拍照權限public static final int MY_PERMISSIONS_REQUEST_READ_SD= 101;//讀SD卡權限public static final int MY_PERMISSIONS_REQUEST_WRITE_SK = 102;//寫SD卡權限public static final int MY_PERMISSIONS_REQUEST_READ_SD_PHOTOALBUM= 103;//寫SD卡權限public static final int MY_PERMISSIONS_REQUEST_WRITE_SK_PHOTOALBUM = 104;//寫SD卡權限public static final int CAPTURE_IMAGE_REQUEST = 104;//拍照后的返回值public static final int LOAD_IMAGE_REQUEST = 105;//相冊的返回值public static final int CLip_IMAGE_REQUEST = 106;//剪裁圖片的返回值public static final String IMAGE_TYPE = "image/*";public static File mOutFile;//圖片uri路徑public static File mImageFile=null;//圖片file路徑public static Integer mBuildVersion=android.os.Build.VERSION.SDK_INT;//當前SDK版本

定義需要用到的接口

public interface UserCenterModel { /** * 拍照 * @param context */ void getFileByPhotograph(Context context); /** * 相冊 * @param context */ void getFileByPhotoAlbum(Context context); /** * 創建img文件 * @return */ File getImagefile(); /** * 開始拍照 * @param context */ void startPhotograph(Context context); /** * 調用相冊 * @param context */ void startPhotoAlbum(Context context); /** * 剪裁圖片 * @param activity */ void startClip(Activity activity, File file); /** * API24 以上調用 * @param context * @param imageFile * @return */ Uri getImageContentUri(Context context, File imageFile);}

接口實現類

public class UserCenterRealize implements UserCenterModel { @Override public void getFileByPhotograph(Context context) { Activity activity = (Activity) context; if (AppConsts.mBuildVersion >= 23) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //申請相機權限 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, AppConsts.MY_PERMISSIONS_REQUEST_CAMERA); } else { if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申請讀SD權限 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, AppConsts.MY_PERMISSIONS_REQUEST_READ_SD); } else { if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申請寫SD權限 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, AppConsts.MY_PERMISSIONS_REQUEST_WRITE_SK); } else { startPhotograph(activity); } } } } else { //拍照 startPhotograph(activity); } } @Override public File getImagefile() { File mediaStorageDir = null; File mediaFile = null; try { mediaStorageDir = new File(Environment.getExternalStorageDirectory().toString() + "/IMAGE/"); Log.d("創建文件夾成功", mediaStorageDir.toString()); } catch (Exception e) { e.PRintStackTrace(); Log.d("創建文件夾失敗", mediaStorageDir.toString()); } if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("創建文件失敗", "WRITE_EXTERNAL_STORAGE 權限"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); Log.d("創建文件成功",mediaFile.toString()); return mediaFile; } @Override public void getFileByPhotoAlbum(Context context) { Activity activity= (Activity) context; if (AppConsts.mBuildVersion >= 23) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申請讀SD權限 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, AppConsts.MY_PERMISSIONS_REQUEST_READ_SD_PHOTOALBUM); } else { if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申請寫SD權限 ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, AppConsts.MY_PERMISSIONS_REQUEST_WRITE_SK_PHOTOALBUM); } else { startPhotoAlbum(context); } } } else { startPhotoAlbum(context); } } @Override public void startPhotoAlbum(Context context) { if(!BitmapUtils.existSDCard()){ Toast.makeText(context, "未檢測到SD卡", Toast.LENGTH_SHORT).show(); return; } Activity a= (Activity) context; Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(AppConsts.IMAGE_TYPE); a.startActivityForResult(getAlbum, AppConsts.LOAD_IMAGE_REQUEST); } @Override public void startPhotograph(Context context) { if(!BitmapUtils.existSDCard()){ Toast.makeText(context, "未檢測到SD卡", Toast.LENGTH_SHORT).show(); return; } Activity activity= (Activity) context; if (AppConsts.mBuildVersion<24){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); mImageFile=getImagefile(); intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(mImageFile)); activity.startActivityForResult(intent, AppConsts.CAPTURE_IMAGE_REQUEST); }else { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ContentValues contentValues = new ContentValues(1); mImageFile=getImagefile(); contentValues.put(MediaStore.Images.Media.DATA, mImageFile.getAbsolutePath()); Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); activity.startActivityForResult(intent, AppConsts.CAPTURE_IMAGE_REQUEST); } } @Override public void startClip(Activity activity, File file) { if(null == file){ return; } mOutFile=getImagefile(); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(getImageContentUri(activity,file),AppConsts.IMAGE_TYPE); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 180); intent.putExtra("outputY", 180); intent.putExtra("scale", true); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mOutFile)); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); activity.startActivityForResult(intent, AppConsts.CLIP_IMAGE_REQUEST); } @Override public Uri getImageContentUri(Context context, File imageFile) { String filePath = imageFile.getAbsolutePath(); Uri uri=null; Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ", new String[] { filePath }, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor .getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); uri= Uri.withAppendedPath(baseUri, "" + id); } else { if (imageFile.exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, filePath); uri= context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { uri= null; } } return uri; }}

Actvity界面中的回調

userCenterRealize.getFileByPhotoAlbum(this);//拍照外部調用 userCenterRealize.getFileByPhotograph(this);//相冊外部調用@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == AppConsts.MY_PERMISSIONS_REQUEST_CAMERA) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { userCenterRealize.getFileByPhotograph(this); } else { Toast.makeText(this, "請授予相機權限", Toast.LENGTH_SHORT).show(); } }else if(requestCode == AppConsts.MY_PERMISSIONS_REQUEST_READ_SD){ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { userCenterRealize.getFileByPhotograph(this); } else { Toast.makeText(this, "請授予讀SD卡權限", Toast.LENGTH_SHORT).show(); } }else if(requestCode == AppConsts.MY_PERMISSIONS_REQUEST_WRITE_SK){ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { userCenterRealize.getFileByPhotograph(this); } else { Toast.makeText(this, "請授予寫SD卡權限", Toast.LENGTH_SHORT).show(); } }else if(requestCode == AppConsts.MY_PERMISSIONS_REQUEST_READ_SD_PHOTOALBUM) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { userCenterRealize.startPhotoAlbum(this); } else { Toast.makeText(this, "請授予讀SD卡權限", Toast.LENGTH_SHORT).show(); } }else if(requestCode == AppConsts.MY_PERMISSIONS_REQUEST_WRITE_SK_PHOTOALBUM) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { userCenterRealize.startPhotoAlbum(this); } else { Toast.makeText(this, "請授予寫SD卡權限", Toast.LENGTH_SHORT).show(); } } }@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 拍照 if (AppConsts.CAPTURE_IMAGE_REQUEST == requestCode) { if (RESULT_OK == resultCode) { Log.d("拍照得到圖片", AppConsts.mImageFile.toString()); int mDegree=BitmapUtils.getBitmapDegree(AppConsts.mImageFile.getAbsolutePath()); Log.d("拍照得到圖片的角度:", String.valueOf(mDegree)); if(mDegree==90||mDegree==180||mDegree==270){ try { Bitmap mBitmap= BitmapUtils.getFileBitmap(AppConsts.mImageFile); Bitmap bitmap=BitmapUtils.rotateBitmapByDegree(mBitmap,mDegree); if(BitmapUtils.saveBitmapFile(bitmap,AppConsts.mImageFile)){ userCenterRealize.startClip(this, AppConsts.mImageFile); }else { Toast.makeText(this, "保存圖片失敗", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "讀取圖片失敗", Toast.LENGTH_SHORT).show(); } }else { userCenterRealize.startClip(this, AppConsts.mImageFile); } } //相冊 } else if (AppConsts.LOAD_IMAGE_REQUEST == requestCode) { if (data != null) { Uri uri = data.getData(); String filepath=FileUtils.getImageAbsolutePath(this, uri); Log.d("相冊獲取到的文件路徑",filepath); File file = new File(filepath); userCenterRealize.startClip(this, file); } //剪裁 } else if (AppConsts.CLIP_IMAGE_REQUEST == requestCode) { Log.d("剪裁得到圖片", AppConsts.mOutFile.toString()); Bitmap bitmap = BitmapUtils.getFileBitmap(AppConsts.mOutFile); imgAvatar.setImageBitmap(bitmap); BitmapUtils.deleteFile(AppConsts.mImageFile); } }

工程中使用到的工具類

public class BitmapUtils { /** * 獲取網絡圖片資源 * @param url * @return */ public static Bitmap getHttpBitmap(String url){ URL myFileURL; Bitmap bitmap=null; try{ myFileURL = new URL(url); //獲得連接 HttpURLConnection conn=(HttpURLConnection)myFileURL.openConnection(); //設置超時時間為6000毫秒,conn.setConnectionTiem(0);表示沒有時間限制 conn.setConnectTimeout(6000); //連接設置獲得數據流 conn.setDoInput(true); //不使用緩存 conn.setUseCaches(false); //這句可有可無,沒有影響 //conn.connect(); //得到數據流 InputStream is = conn.getInputStream(); //解析得到圖片 bitmap = BitmapFactory.decodeStream(is); //關閉數據流 is.close(); }catch(Exception e){ e.printStackTrace(); } return bitmap; } /** * 判斷是否有SD卡 * @return */ public static boolean existSDCard() { if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){ return true; }else { return false; } } /** * 從文件中讀取圖片 * @param file * @return */ public static Bitmap getFileBitmap(File file) { FileInputStream fis = null; Bitmap bitmap=null; try { //把圖片轉化為字節流 fis = new FileInputStream(file); //把流轉化圖片 bitmap = BitmapFactory.decodeStream(fis); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { fis.close();//關閉流 } catch (IOException e) { e.printStackTrace(); } } return bitmap; } /** * 讀取圖片的旋轉的角度 * * @param path * 圖片絕對路徑 * @return 圖片的旋轉角度 */ public static int getBitmapDegree(String path) { int degree = 0; try { // 從指定路徑下讀取圖片,并獲取其EXIF信息 ExifInterface exifInterface = new ExifInterface(path); // 獲取圖片的旋轉信息 int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } /** * 將圖片按照某個角度進行旋轉 * * @param bm * 需要旋轉的圖片 * @param degree * 旋轉角度 * @return 旋轉后的圖片 */ public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) { Bitmap returnBm = null; // 根據旋轉角度,生成旋轉矩陣 Matrix matrix = new Matrix(); matrix.postRotate(degree); try { // 將原始圖片按照旋轉矩陣進行旋轉,并得到新的圖片 returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); } catch (OutOfMemoryError e) { } if (returnBm == null) { returnBm = bm; } if (bm != returnBm) { bm.recycle(); } return returnBm; } /** * 刪除文檔 * @param file */ public static boolean deleteFile(File file) { try { if(file!=null) { if(FileUtils.deleteFile(file.getAbsolutePath())){ AppConsts.mImageFile=null; Log.d("刪除文件","true"); return true; }else { return false; } }else { Log.d("刪除文件路徑為空","false"); return false; } } catch (Exception e) { e.printStackTrace(); Log.d("刪除文件","false"); return false; } } /** * 保存圖片 * @param bitmap * @param file */ public static boolean saveBitmapFile(Bitmap bitmap, File file){ try { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); bos.flush(); bos.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } }public class FileUtils { /** * 刪除單個文件 * @param filePath 被刪除文件的文件名 * @return 文件刪除成功返回true,否則返回false */ public static boolean deleteFile(String filePath) { File file = new File(filePath); if (file.isFile() && file.exists()) { return file.delete(); } return false; } /** * 根據Uri獲取圖片絕對路徑,解決Android4.4以上版本Uri轉換 * @param context * @param imageUri * @author yaoxing * @date 2014-10-12 */ @TargetApi(19) public static String getImageAbsolutePath(Activity context, Uri imageUri) { if (context == null || imageUri == null) return null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, imageUri)) { if (isExternalStorageDocument(imageUri)) { String docId = DocumentsContract.getDocumentId(imageUri); String[] split = docId.split(":"); String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (isDownloadsDocument(imageUri)) { String id = DocumentsContract.getDocumentId(imageUri); Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } else if (isMediaDocument(imageUri)) { String docId = DocumentsContract.getDocumentId(imageUri); String[] split = docId.split(":"); 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; } String selection = MediaStore.Images.Media._ID + "=?"; String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(imageUri.getScheme())) { // Return the remote address if (isGooglePhotosUri(imageUri)) return imageUri.getLastPathSegment(); return getDataColumn(context, imageUri, null, null); } // File else if ("file".equalsIgnoreCase(imageUri.getScheme())) { return imageUri.getPath(); } return null; } private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; String column = MediaStore.Images.Media.DATA; String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ private static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ private static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ private static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".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()); }}

The End

QQ:3355168235(遇到問題或者有更好的建議請聯系我額)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 司法| 定西市| 乳源| 陆丰市| 平果县| 普兰县| 罗定市| 珲春市| 邯郸市| 新建县| 东平县| 新源县| 宁波市| 阿鲁科尔沁旗| 前郭尔| 塘沽区| 东安县| 佛学| 井冈山市| 偏关县| 孝昌县| 大丰市| 三江| 安徽省| 万源市| 徐水县| 嵊泗县| 衡阳县| 深圳市| 永善县| 周口市| 博湖县| 永和县| 武清区| 水城县| 凭祥市| 新营市| 景德镇市| 灌阳县| 张家界市| 澄江县|