java - FileOutputStream 总是触发 ioException

标签 java android

我正在编写一个 Android 应用程序,这是我第一次使用 Java。我正在尝试将位图导出为 PNG 文件并将其保存到目录中。然而,FileOutPutStream总是触发ioexception 。我已经使用 isDirectory 检查了路径它返回 true。有人可以看一下我的代码,看看我哪里出错了吗?

protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
        TextView result = findViewById(R.id.textView);
        String state = Environment.getExternalStorageState();
        if (!state.equals(Environment.MEDIA_MOUNTED)) {
            return;
        }
        // Check which request we're responding to
        if (requestCode == PICK_IMAGE) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
                //get image Uri
                Uri imageUri = resultIntent.getData();
                //get image path through Uri
                Bitmap bitmap;
                //getting path of external DCIM directory
                File dstPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
                //checking if directory exists
                if(dstPath.isDirectory()) {
                    result.setText("True");

                }
                String filename = "test.png";
                File file = new File(dstPath,filename);
                //result.setText(file.toString());

                try {
                    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
                    //result.setText(bitmap.toString());
                    FileOutputStream out = new FileOutputStream(file);
                    result.setText("flag");
                    if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)==false){
                        result.setText("0");
                    }
                    else {
                        result.setText("1");
                    }
                    out.flush();
                    out.close();

                } catch(IOException e){

                    e.printStackTrace();
                    result.setText("false");
                }

            }
        }
    }

这是堆栈跟踪

2020-02-26 12:55:23.534 10261-10261/com.example.webviewproject E/YOUR_APP_LOG_TAG: I got an error
    java.io.FileNotFoundException: /storage/emulated/0/DCIM/test.png (Permission denied)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:308)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
        at com.example.webviewproject.MainActivity.onActivityResult(MainActivity.java:102)
        at android.app.Activity.dispatchActivityResult(Activity.java:7454)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

最佳答案

我认为您需要授予运行时权限才能访问该文件

检查这个answer

关于java - FileOutputStream 总是触发 ioException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60419635/

相关文章:

android - 在两个 Activity 之间传递位图

android - 实现帮助系统

java - 在 Java 中格式化帕斯卡三角形

java - 如何在 Spring Boot wicket 应用程序中注入(inject) RequestScope bean

java - 如何使用 Spring MVC 和 Java 获取基本的 HTTP 身份验证数据

java - 在 Spring EL 中使用数组的内容

android - 从传入消息 (SMS) 中获取 IMSI 号码或目标电话号码

android - 实现横向导航时应用程序崩溃

java - 将两个不同长度的个体交叉

android - 禁用按钮在触摸时失去按下状态