我已经看到很多与此有关的问题,但仍然无法解决我的问题。
我有一个名为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)
我不确定,但是我认为此错误是由于没有写文件的权限而引起的。如何在运行时赋予此权限?
答案 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可以在所有版本中使用。
希望这对您有帮助