android - java.io.IOException:权限被拒绝在 sdcard 上保存位图图像
问题描述
我尝试将位图图像保存在 sdcard 上,但显示权限异常。
SD卡权限
<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)
解决方案
您必须在 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>
推荐阅读
- css - 如何在 React/Antd 中将标签栏标题创建为固定/粘性?
- c# - 在 WPF 中以高刷新率显示字节数组图像
- spring - 启动时如何在控制台中打印spring-boot应用程序的日志目录?
- android - Intl.NumberFormat.formatToParts 不是函数
- scikit-learn - 聚类评估中的 ValueError:预期 2D 数组,得到 1D 数组
- android - 为什么删除 jcenter() 存储库会导致我为 sqlite-android:3.36.0 构建的 Android 应用程序失败
- docker - 无法创建重启策略以通过 Docker 安全平台
- python-3.x - 在 * .docx 中使用 python 和 win32com 进行拼写检查 - * .docx 的问题
- outlook - 如何配置连接到多个共享 Outlook 邮箱的 .pbix 文件,以便其他同事可以看到仪表板?
- c++ - 如何确保传入的 quickFix 消息具有有限的大小?