Android完全解決6.0以上機型不能拍照選擇相簿問題
阿新 • • 發佈:2019-01-28
由於最近專案涉及實現上傳圖片,由手機拍照和從相簿選擇圖片,弄了好幾天,最終解決所有問題,包括Android6.0不能拍照,選擇相簿得不到路徑,今天特意記錄下~
首先需要畫好佈局,以及工具類 效果圖
直接貼程式碼了,沒什麼技術含量,只是蒐集資料很不容易而已~
case R.id.takePhotoBtnId://拍照 bottomView1.dismiss(); // bottomView.dismiss(); if (PermissionsUtils.isCameraPermission(AddMenuActivity.this, 0x007)) if(i > 5) { ToastCommonUtils.showCommonToast(AddMenuActivity.this, "最多上傳5張"); return; } byCamera1();
break;
case R.id.pickPhtotBtnId://相簿 Integer sdk_int2 = Integer.valueOf(Build.VERSION.SDK); if (sdk_int2 >= 23) { PermissionGen.with(this) .addRequestCode(100) .permissions( Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_SETTINGS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.GET_ACCOUNTS) .request(); } bottomView1.dismiss(); if (i > 5) { ToastCommonUtils.showCommonToast(AddMenuActivity.this, "最多上傳5張"); } Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent, 4); break;
public void byCamera1() { String savePath = ""; String storageState = Environment.getExternalStorageState(); if (storageState.equals(Environment.MEDIA_MOUNTED)) { savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/camera/"; File savedir = new File(savePath); if (!savedir.exists()) { savedir.mkdirs(); } } // 沒有掛載SD卡,無法儲存檔案 if (savePath == null || "".equals(savePath)) { System.out.println("無法儲存照片,請檢查SD卡是否掛載"); return; } b++; String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss" + b).format(new Date()); //照片命名 String fileName = timeStamp + ".png"; File out = new File(savePath, fileName); Uri uri = Uri.fromFile(out); //該照片的絕對路徑 path = savePath + fileName; Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 0x003); }
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == 3) {list.add(0, path); adapter.notifyDataSetChanged(); Bitmap bitmap = getSmallBitmap(path, 400, 400);i++; try { FileOutputStream os = new FileOutputStream(path); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, os); os.flush(); os.close(); if (!bitmap.isRecycled()) { bitmap.recycle(); } } catch (Exception e) { Log.e("mate", Log.getStackTraceString(e)); } } if (resultCode == RESULT_OK && requestCode == 2) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));int sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK); Log.d("sdkVersion:", String.valueOf(sdkVersion)); Log.d("KITKAT:", String.valueOf(Build.VERSION_CODES.KITKAT)); if (sdkVersion >= 19) { // 或者 android.os.Build.VERSION_CODES.KITKAT這個常量的值是19 path1 = uri.getPath();//5.0直接返回的是圖片路徑 Uri.getPath is : /document/image:46 ,5.0以下是一個和資料庫有關的索引值 System.out.println("path:" + path); // path_above19:/storage/emulated/0/girl.jpg 這裡才是獲取的圖片的真實路徑 path1 = getPath_above19(AddMenuActivity.this, uri); addThemeIv.setImageBitmap(PermissionsUtils.getBitmapByPath(path1, 100, 100)); } else { path1 = getFilePath_below19(uri); addThemeIv.setImageBitmap(PermissionsUtils.getBitmapByPath(path1, 100, 100)); } } catch (FileNotFoundException e) { Log.e("Exception", e.getMessage(), e); } Uri selectedImage = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); if (cursor != null) { cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); path1 = cursor.getString(columnIndex); cursor.close(); } } if (resultCode == RESULT_OK && requestCode == 4) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); /* 將Bitmap設定到ImageView */ // iv_local_pic.setImageBitmap(bitmap); int sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK); Log.d("sdkVersion:", String.valueOf(sdkVersion)); Log.d("KITKAT:", String.valueOf(Build.VERSION_CODES.KITKAT)); if (sdkVersion >= 19) { // 或者 android.os.Build.VERSION_CODES.KITKAT這個常量的值是19 path = uri.getPath();//5.0直接返回的是圖片路徑 Uri.getPath is : /document/image:46 ,5.0以下是一個和資料庫有關的索引值 System.out.println("path:" + path); // path_above19:/storage/emulated/0/girl.jpg 這裡才是獲取的圖片的真實路徑 path = getPath_above19(AddMenuActivity.this, uri); list.add(0, path); adapter.notifyDataSetChanged(); i++; System.out.println("path_above19:" + path); } else { path = getFilePath_below19(uri); list.add(0, path); adapter.notifyDataSetChanged(); } } catch (FileNotFoundException e) { Log.e("Exception", e.getMessage(), e); } } }
我的做法是把所有的路徑都加入list集合中,在介面卡中轉換成bitmap,顯示出來,整體思路就這麼多,如果有疑問 諮詢我qq 1921940606