java.io.IOException:权限被拒绝在 sdcard 上保存位图图像 [重复]
Posted
技术标签:
【中文标题】java.io.IOException:权限被拒绝在 sdcard 上保存位图图像 [重复]【英文标题】:java.io.IOException: Permission denied Save Bitmap image on sdcard [duplicate] 【发布时间】:2020-01-29 14:54:11 【问题描述】:我尝试将位图图像保存在 sdcard 上,但显示权限异常。
sdcard 权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
java.io.FileNotFoundException: /storage/emulated/0/Horoscope/IMG_1569837709260.png (Permission denied)
我的保存位图方法
public static void saveImage(Bitmap finalBitmap, Activity activity)
File myDir = new File(Environment.getExternalStorageDirectory().getPath() + "/Horoscope");
myDir.mkdirs();
String fname = "IMG_" + System.currentTimeMillis() + ".png";
File file = new File(myDir, fname);
try (FileOutputStream out = new FileOutputStream(file))
finalBitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
MediaStore.Images.Media.insertImage(activity.getContentResolver(), file.getPath(), fname, "description");
Toast.makeText(activity, "Saved.", Toast.LENGTH_SHORT).show();
catch (IOException e)
e.printStackTrace();
错误异常
java.io.FileNotFoundException: /storage/emulated/0/Horoscope/IMG_1569837709260.png (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:287)
at java.io.FileOutputStream.<init>(FileOutputStream.java:223)
at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
at com.example.opencv.utils.Constant.saveImage(Constant.java:378)
at com.example.opencv.activity.ForeignerMakerResultActivity$3.onClick(ForeignerMakerResultActivity.java:106)
at android.view.View.performClick(View.java:6319)
at android.view.View$PerformClick.run(View.java:24955)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:192)
at android.app.ActivityThread.main(ActivityThread.java:6760)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
【问题讨论】:
您申请了权限吗?似乎您刚刚写入了权限,但您还没有请求权限。只需请求权限,并在用户授予权限后保存您的位图 SD卡等危险权限需要申请“运行时权限”。请查看我评论的链接。 您可以使用下面的 repo 使用注释来获得运行时权限。 github.com/permissions-dispatcher/PermissionsDispatcher 【参考方案1】:您必须在 tun 时检查并授予存储权限。
除此之外,您还需要为 SDK 版本 >23 添加以下代码
扩展 Application 类并在 onCreate() 方法中放入代码
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
if (Build.VERSION.SDK_INT > 23)
builder.detectFileUriExposure();
在 Manifest.xml 中将 android:name 值设置为您的应用程序类。
就像,
<application
android:name="com.gym.client.WebURLApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
</application>
【讨论】:
【参考方案2】:您必须请求 Activity 的权限
ActivityCompat.requestPermissions(this, new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,1);
您还应该检查 mkdirs 结果以捕获这样的错误
if (myDir.mkdirs())
【讨论】:
【参考方案3】:由于WRITE_EXTERNAL_STORAGE
和READ_EXTERNAL_STORAGE
是关键权限,您必须在manifest
中声明它们后在运行时检查权限。
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED)
// Permission is granted
else
//Permission is not granted so you have to request it
ActivityCompat.requestPermissions(activity,
new String[]Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,
MY_PERMISSIONS_REQUEST);
【讨论】:
以上是关于java.io.IOException:权限被拒绝在 sdcard 上保存位图图像 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Spark.read.csv 错误:java.io.IOException:权限被拒绝
logcat 充满了 java.io.IOException:连接被拒绝的消息
java.io.IOException: toDerInputStream 拒绝标签类型 77