1. 程式人生 > >Android呼叫系統相簿、拍照以及裁剪最簡單的實現(相容7.0)

Android呼叫系統相簿、拍照以及裁剪最簡單的實現(相容7.0)

/** * 相片工具類 */ public class PhotoUtils { private static final String TAG = "PhotoUtils"; /** * @param activity * 當前activity * @param imageUri * 拍照後照片儲存路徑 * @param requestCode * 呼叫系統相機請求碼 */ public static void takePicture(Activity activity, Uri imageUri, int
requestCode) { //呼叫系統相機 Intent intentCamera = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //新增這一句表示對目標應用臨時授權該Uri所代表的檔案 } intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //將拍照結果儲存至photo_file的Uri中,不保留在相簿中
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); activity.startActivityForResult(intentCamera, requestCode); } /** * @param fragment * 當前fragment * @param imageUri * 拍照後照片儲存路徑 * @param requestCode * 呼叫系統相機請求碼 */ public static void takePicture
(Fragment fragment, Uri imageUri, int requestCode) { //呼叫系統相機 Intent intentCamera = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //新增這一句表示對目標應用臨時授權該Uri所代表的檔案 } intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //將拍照結果儲存至photo_file的Uri中,不保留在相簿中 intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); fragment.startActivityForResult(intentCamera, requestCode); } /** * @param activity * 當前activity * @param requestCode * 開啟相簿的請求碼 */ public static void openPic(Activity activity, int requestCode) { Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); photoPickerIntent.setType("image/*"); activity.startActivityForResult(photoPickerIntent, requestCode); } /** * @param fragment * 當前fragment * @param requestCode * 開啟相簿的請求碼 */ public static void openPic(Fragment fragment, int requestCode) { Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); photoPickerIntent.setType("image/*"); fragment.startActivityForResult(photoPickerIntent, requestCode); } /** * @param activity * 當前activity * @param orgUri * 剪裁原圖的Uri * @param desUri * 剪裁後的圖片的Uri * @param aspectX * X方向的比例 * @param aspectY * Y方向的比例 * @param width * 剪裁圖片的寬度 * @param height * 剪裁圖片高度 * @param requestCode * 剪裁圖片的請求碼 */ public static void cropImageUri(Activity activity, Uri orgUri, Uri desUri, int aspectX, int aspectY, int width, int height, int requestCode) { Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } intent.setDataAndType(orgUri, "image/*"); intent.putExtra("crop", "true"); /* intent.putExtra("aspectX", aspectX); intent.putExtra("aspectY", aspectY); intent.putExtra("outputX", width); intent.putExtra("outputY", height);*/ intent.putExtra("scale", true); //將剪下的圖片儲存到目標Uri中 intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri); intent.putExtra("return-data", false); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); activity.startActivityForResult(intent, requestCode); } /** * @param fragment * 當前activity * @param orgUri * 剪裁原圖的Uri * @param desUri * 剪裁後的圖片的Uri * @param aspectX * X方向的比例 * @param aspectY * Y方向的比例 * @param width * 剪裁圖片的寬度 * @param height * 剪裁圖片高度 * @param requestCode * 剪裁圖片的請求碼 */ public static void cropImageUri(Fragment fragment, Uri orgUri, Uri desUri, int aspectX, int aspectY, int width, int height, int requestCode) { Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } intent.setDataAndType(orgUri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", aspectX); intent.putExtra("aspectY", aspectY); intent.putExtra("outputX", width); intent.putExtra("outputY", height); intent.putExtra("scale", true); //將剪下的圖片儲存到目標Uri中 intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri); intent.putExtra("return-data", false); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); fragment.startActivityForResult(intent, requestCode); } /** * 讀取uri所在的圖片 * @param uri * 圖片對應的Uri * @param mContext * 上下文物件 * @return 獲取影象的Bitmap */ public static Bitmap getBitmapFromUri(Uri uri, Context mContext) { try { Bitmap bitmap = MediaStore.Images.Media. getBitmap(mContext.getContentResolver(), uri); return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } } /** * @param context * 上下文物件 * @param uri * 當前相簿照片的Uri * @return 解析後的Uri對應的String */ @SuppressLint("NewApi") public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; String pathHead = "file:///"; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return pathHead + Environment.getExternalStorageDirectory() + "/" + split[1]; } } // DownloadsProvider 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 pathHead + getDataColumn(context, contentUri, null, null); } // MediaProvider 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 pathHead + getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { return pathHead + getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return pathHead + uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * @param context * The context. * @param uri * The Uri to query. * @param selection * (Optional) Filter used in the query. * @param selectionArgs * (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ private 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 column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_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()); } }

相關推薦

Android呼叫系統相簿拍照以及裁剪簡單實現(相容7.0)

/** * 相片工具類 */ public class PhotoUtils { private static final String TAG = "PhotoUtils"; /** * @param activity * 當前activity *

Android呼叫系統相機相簿功能,適配6.0許可權獲取以及7.0以後獲取URI(相容多版本)

  Android中呼叫系統相機來拍攝照片的程式碼,如下:1、首先設定Uri獲取判斷以及相機請求Codepublicfinalint TYPE_TAKE_PHOTO = 1;//Uri獲取型別判斷publicfinalint CODE_TAKE_PHOTO = 1;//相機R

Android呼叫系統相機相簿裁剪圖片並壓縮上傳(適配7.0

作者:八怪不姓醜 連結:http://www.jianshu.com/p/e11a34e2ea4f 著作權歸作者所有,本文經作者授權推送。 一、前言 最近在開發中遇到了一個比較棘手的問題 由於在之前使用的版本-targetSdkVersion小於24也就是小於7.

Android呼叫系統相簿系統相機拍照

呼叫系統相機拍照: intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, RESULT_CAMARA_IMAGE); // RESULT_CAMARA_IMA

iOS 適配 iOS11,會引起呼叫系統相簿分享郵件的系統介面上移問題

適配 iOS11,避免滾動檢視頂部出現20的空白,全域性設定了UIScrollView。 if (@available(iOS 11.0, *)) {   [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollView

解決Android呼叫系統相機連續拍照出現的記憶體溢位問題

記憶體溢位相信做過程式設計的人都知道一二,這裡說Android 記憶體溢位的問題:、問題描述:Android下的相機在獨自使用時,拍照沒有問題,通過我們的程式碼呼叫時,也正常,但是更換了不同廠商的平板,ROM由Android4.0變成了Android4.1後,拍照出現了Out

Android 呼叫系統相機,拍照,並上傳圖片所注意的一些問題

其實android拍照這個地方還是有很多注意事項的,我在上個專案中就遇到一些坑,因此我想把它記錄下來,希望能幫助一些跟我遇到的同樣的問題的人 如果你在專案中遇到以下問題: 通過系統路徑,拍出來的圖片不清楚 在某些情況下,onActivityResult

input type=“file” 在移動端H5頁面實現呼叫本地相簿拍照錄音

<input type="file" accept="image/*" mutiple="mutiple" capture="camera" /> 三個屬性: accept - 規定可提交的檔案型別。 capture - 系統所捕獲的預設裝置。camera(照相機),camc

Android呼叫系統相機自定義相機處理大圖片

Android呼叫系統相機和自定義相機例項 本博文主要是介紹了android上使用相機進行拍照並顯示的兩種方式,並且由於涉及到要把拍到 的照片顯示出來,該例子也會涉及到Android載入大圖片時候的處理(避免OOM),還有簡要提一下有些人SurfaceView出現黑屏的原因。 An

android 呼叫 系統 相機 攝像機 拍照 拍視訊

主要內容如下:系統現有相機應用的呼叫 系統現有相機拍攝照片 獲取系統現有相機拍攝的圖片 系統現有相機拍攝圖片Demo 系統現有相機拍攝視訊 系統現有相機拍攝視訊Demo 系統現有相機應用的呼叫   對於如何呼叫系統現有應用,之前就有講解,這裡簡單再說一下。在開發的應用中呼叫

Android 呼叫系統相簿選擇圖片並顯示

主要程式碼: package wkk.app2; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; imp

iOS 呼叫系統相簿相機 顯示中文標題

專案中經常要訪問手機的攝像機或者相簿,訪問之前首頁要判斷使用者是否允許訪問,如果使用者不允許訪問,當用戶再次點選訪問相簿或者攝像機的時候就要給提示了。當訪問攝像機或者相簿的時候,介面上的取消和確定一張圖片的時候出現的按鈕(取消、重拍、使用照片都是英文),如何把這

android 呼叫系統相機進行拍照及照片的裁切

呼叫系統相機進行拍照是android開發中常用到的功能,例如:拍照了直接發朋友圈等。還有常用的要進行圖片的裁剪,例如:上傳自己的頭像等。你又不能拍完照直接上傳,然後在讀取截止中間的,這樣不一定是使用者想要的部分。所以,我們通常是讓使用者自己按照我們的比例,來進行裁剪。這就

Android 呼叫系統相簿選取視訊,過濾視訊(相容小米)

老規矩先上圖,注:我這個是其他型別裝置的樣式圖,小米也一樣的由於小米手機可能對很多地方不見讓,當然對呼叫系統相機時也跟其他裝置不太一樣,一般情況下他都是底下彈出一個框,選取是否進入相簿或者資料夾下面就來貼一下程式碼這是在選取相簿選取視訊的頁面

Android拍照及圖片裁剪呼叫系統相簿相容6.0以上許可權處理及7.0以上檔案管理)

前言: 最近工作修改較舊的專案時,涉及到了圖片相關功能 ,在使用安卓6.0手機及7.1手機拍照時,遇到了因許可權及檔案管理導致程式崩潰等問題。 剛好把功能修改完,把程式碼簡單地貼一下,方便以後使用。 本文demo包含以下要點: Android6.0執

Android完美呼叫系統相機相簿以及裁剪功能

在 Android應用中,很多時候我們需要實現上傳圖片,或者直接呼叫手機上的拍照功能拍照處理然後直接顯示並上傳功能,下面將講述呼叫相機拍照處理圖片然後顯示和呼叫手機相簿中的圖片處理然後顯示的功能,要想實現上傳功能,一般都是上傳到資料庫中,將imageView中的

呼叫Android系統攝像頭進行拍照以及相簿選擇圖片

很多時候我們需要呼叫系統攝像頭進行拍照或者從相簿選擇照片,然後對得到的圖片進行一些處理。比如微信設定頭像,就可以選擇呼叫裝置存在攝像頭APP進行拍照,然後對影象進行裁剪,最終設定為頭像。 下面來進行講解。 主要分為以下幾個部分: 1、獲得攝像頭Feature和寫檔案的許

Android 呼叫系統相機拍照並且顯示在相簿中,以及中間可能會遇到的一些問題的解決

主要思路是在使用照相機拍照,然後為拍得的照片在SD卡新開一個儲存照片的檔案 程式碼:因為要呼叫照相機和SD卡所以需要新增以下許可權: 在manifests中新增 <uses-permission android:name="android.permission.CAM

android 呼叫系統照相機拍照後儲存到系統相簿,在系統圖庫中能看到

需求:  呼叫系統照相機進行拍照,並且儲存到系統相簿,呼叫系統相簿的時候能看到 系統相簿的路徑:String cameraPath= Environment.getExternalStorageDi

(複習)android 呼叫系統相機 相簿 裁剪-圖片上傳-客服端-伺服器

效果: 客服端程式碼: package com.cn.lxz.zhaopian; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat;