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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值