2019-05-06 13:48:35 3809瀏覽
今天千鋒扣丁學(xué)堂Android培訓(xùn)老師主要給大家介紹了關(guān)于Android圖片或拍照選擇圖片功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),下面我們一起來看一下吧。
ChooseImageTask.getInstance() .createBuilder(this) .setFileName("圖片名稱")//有默認(rèn)的 .setFilePath("圖片路徑")//有默認(rèn)的 .setIsCrop(false)//裁剪 .setIsCompress(true)//壓縮 .setOnSelectListener(this)//監(jiān)聽回調(diào)結(jié)果 .setType(ChooseImageTask.TYPE_GALLERY)//類型 .perform();
/** * 從系統(tǒng)圖庫里面選擇 * * @param activity * @param builder */ private void takeImageFromGallery(Activity activity, Builder builder) { OnSelectListener mOnSelectListener = builder.mOnSelectListener; Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ComponentName componentName = intent.resolveActivity(activity.getPackageManager()); if (componentName != null) { activity.startActivityForResult(intent, builder.mType); } else { if (mOnSelectListener != null) { mOnSelectListener.onError("takeImageFromGallery---> Activity is illegal"); } } }
/** * 從圖片類型文件中選擇圖片 * * @param activity */ private void takeImageFromAlbum(Activity activity, Builder builder) { OnSelectListener mOnSelectListener = builder.mOnSelectListener; Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);//api19之后 // Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//api19之前 intent.setType("image/*"); ComponentName componentName = intent.resolveActivity(activity.getPackageManager()); if (componentName != null) { activity.startActivityForResult(intent, builder.mType); } else { if (mOnSelectListener != null) { mOnSelectListener.onError("takeImageFromAlbum---> Activity is illegal"); } } }
/** * 拍照 * * @param activity */ private void takePhoto(Activity activity, ChooseImageTask.Builder builder) { ChooseImageTask.OnSelectListener mOnSelectListener = builder.mOnSelectListener; Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //校驗(yàn)activity是否存在 if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) { //判斷是否自定義路徑并且是否合法 Uri fileUri = UriUtils.getUri(activity, new File(builder.mFilePath, builder.mFileName)); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); activity.startActivityForResult(takePictureIntent, builder.mType); } else { if (mOnSelectListener != null) { mOnSelectListener.onError("takePhoto---> Activity is illegal"); } } } <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external" path="." /> </paths>
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/choose_image" /> </provider>
/** * 根據(jù)文件獲取URI * * @param context * @param file * @return */ public static Uri getUri(Context context, File file) { Uri uri; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(context, FileProvider的路徑 , file); } else { uri = Uri.fromFile(file); } //這里盡量還是要保證URI不要為空,否則報(bào)空指針異常 return uri; }
/** * 圖片類型的裁剪 * * @param activity * @param uri * @param outputUri */ public void handleCropImage(Activity activity, Uri uri, Uri outputUri) { //打開系統(tǒng)自帶的裁剪圖片的intent Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //添加這一句表示對(duì)目標(biāo)應(yīng)用臨時(shí)授權(quán)該Uri所代表的文件 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } intent.setDataAndType(uri, "image/*"); intent.putExtra("scale", true); // 設(shè)置裁剪區(qū)域的寬高比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // 設(shè)置裁剪區(qū)域的寬度和高度 intent.putExtra("outputX", 350); intent.putExtra("outputY", 350); // 人臉識(shí)別 intent.putExtra("noFaceDetection", true); // 圖片輸出格式 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); // 若為false則表示不返回?cái)?shù)據(jù) intent.putExtra("return-data", false); //輸出圖片到指定位置 intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); activity.startActivityForResult(intent, ChooseImageTask.TYPE_CROP); }
/** * 讀取圖片的旋轉(zhuǎn)的角度 * * @param path 圖片絕對(duì)路徑 * @return 圖片的旋轉(zhuǎn)角度 */ public static int getBitmapDegree(String path) { int degree = 0; try { // 從指定路徑下讀取圖片,并獲取其EXIF信息 ExifInterface exifInterface = new ExifInterface(path); // 獲取圖片的旋轉(zhuǎn)信息 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; } /** * 旋轉(zhuǎn)圖片,使圖片保持正確的方向。 * * @param bitmap 原始圖片 * @param degrees 原始圖片的角度 * @return Bitmap 旋轉(zhuǎn)后的圖片 */ public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) { if (degrees == 0 || null == bitmap) { return bitmap; } Matrix matrix = new Matrix(); matrix.setRotate(degrees, bitmap.getWidth() / 2, bitmap.getHeight() / 2); Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); bitmap.recycle(); return bmp; }
/** * 代理Activity的返回值過程然后 * * @param requestCode * @param resultCode * @param data */ public void handleResult(int requestCode, int resultCode, @Nullable Intent data, Builder builder) { if (resultCode != Activity.RESULT_OK) { return; } switch (requestCode) { case TYPE_PHOTO:// 拍照 handlePhoto(builder); break; case TYPE_ALBUM:// //跳轉(zhuǎn)到裁剪頁面 handleGallery(data, builder); break; case TYPE_GALLERY:// 圖庫選擇圖片 //跳轉(zhuǎn)到裁剪頁面 handleGallery(data, builder); break; case TYPE_CROP: handleCropResult(builder); break; } }
/** * 質(zhì)量壓縮方法 * * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中 int options = 100; while (baos.toByteArray().length / 1024 > 100) { //循環(huán)判斷如果壓縮后圖片是否大于100kb,大于繼續(xù)壓縮 baos.reset();//重置baos即清空baos //第一個(gè)參數(shù) :圖片格式 ,第二個(gè)參數(shù): 圖片質(zhì)量,100為最高,0為最差 ,第三個(gè)參數(shù):保存壓縮后的數(shù)據(jù)的流 image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中 options -= 10;//每次都減少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮后的數(shù)據(jù)baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數(shù)據(jù)生成圖片 return bitmap; }
想要了解更多關(guān)于Android開發(fā)方面內(nèi)容的小伙伴,請(qǐng)關(guān)注扣丁學(xué)堂Android培訓(xùn)官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的Android講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的Android視頻教程定能讓你快速掌握Android從入門到精通開發(fā)實(shí)戰(zhàn)技能。
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入HTML5進(jìn)階免費(fèi)公開課】
查看更多關(guān)于“Android開發(fā)技術(shù)”的相關(guān)資訊>>