1. 程式人生 > >Android完全解決6.0以上機型不能拍照選擇相簿問題

Android完全解決6.0以上機型不能拍照選擇相簿問題

   由於最近專案涉及實現上傳圖片,由手機拍照和從相簿選擇圖片,弄了好幾天,最終解決所有問題,包括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