如何在片段中请求WRITE_EXTERNAL_STORAGE权限

时间:2018-06-29 08:46:38

标签: java android

我已经看到很多与此有关的问题,但仍然无法解决我的问题。 我有一个名为CameraFragment.java的片段,它可以打开相机并保存拍摄的照片。问题是,要保存我需要具有WRITE_EXTERNAL_STORAGE权限...我已将以下行添加到Manifest.xml中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

但是在我的 logcat 中,当我运行以下代码来保存图像时:

private void saveImage(Bitmap finalBitmap, String image_name) {

    final String appDirectoryName = "Feel";
    String root = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES).toString();
    File myDir = new File(root);
    myDir.mkdirs();
    String fname = "Image" + image_name + ".jpg";
    File file = new File(myDir, fname);
    //if (file.exists()) file.delete();
    Log.i("LOAD", root + fname);
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我仍然收到此错误: W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Pictures/Imageimagem1.jpg (Permission denied)

我不确定,但是我认为此错误是由于没有写文件的权限而引起的。如何在运行时赋予此权限?

3 个答案:

答案 0 :(得分:1)

Click here获得运行时权限!请查看此github.com/Karumi/Dexter

答案 1 :(得分:0)

这是一个类,带有请求存储权限的方法

public class PermissionManager {
public static boolean checkPermissionREAD_EXTERNAL_STORAGE(final Context context) {
    int currentAPIVersion = Build.VERSION.SDK_INT;
    if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(
                    (Activity) context,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                showDialog("External storage", context,
                        Manifest.permission.READ_EXTERNAL_STORAGE);

            } else {
                ActivityCompat
                        .requestPermissions(
                                (Activity) context,
                                new String[] { Manifest.permission.READ_EXTERNAL_STORAGE },
                                101);
            }
            return false;
        } else {
            return true;
        }

    } else {
        return true;
    }
}
}

在您的活动中使用:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Permission given",
                        Toast.LENGTH_SHORT).show();
                //saveImage(finalBitmap, image_name); <- or whatever you want to do after permission was given . For instance, open gallery or something 
            } else {
                Toast.makeText(this, "Permission Denied",
                        Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions,
                    grantResults);
    }
}

对于您而言,在保存文件之前,您还将进行检查

if (PermissionManager.checkPermissionREAD_EXTERNAL_STORAGE(this)){
        saveImage(finalBitmap, image_name);
    }

答案 2 :(得分:0)

您可以使用PermissionDispatcher轻轻地处理它,因为AFAIK可以在所有版本中使用。

希望这对您有帮助