Android完全解决6.0以上机型不能拍照选择相册问题

来源:互联网 发布:淘宝助理无法打印 编辑:程序博客网 时间:2024/05/16 11:25

   由于最近项目涉及实现上传图片,由手机拍照和从相册选择图片,弄了好几天,最终解决所有问题,包括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
原创粉丝点击