ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java.io.FileNotFoundException :(使用ObjectOutputStream写入对象时(权限被拒绝)

2019-10-12 14:05:17  阅读:309  来源: 互联网

标签:android java android-permissions


我已经尝试解决了几个小时,我非常沮丧,所以我来找你们寻求指导.

我正在尝试保存和检索我创建的用户对象.我想要这样做,以便可以从整个应用程序的任何意图中保存和检索此User对象,因此我决定使用FileInput和Output流.我在下面都包含了我的代码.

这是我的输出数据方法:

public static void serializeDataOut(User ish) {
    try {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath();
        File newFile = new File(path + "myFile.ser");
        FileOutputStream fos = new FileOutputStream(newFile);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(ish);
        oos.flush();
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我的输入数据方法:

public static User serializeDataIn(){
    try{
        String path = Environment.getExternalStorageDirectory().getAbsolutePath();
        FileInputStream fin = new FileInputStream(path + "myFile.ser");
        ObjectInputStream ois = new ObjectInputStream(fin);
        User iUser = (User) ois.readObject();
        ois.close();
        return iUser;
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}

注意:这两个方法都位于我的User类中,该类也实现了Serializable.

文件路径的整个错误如下所示:java.io.FileNotFoundException:/storage/emulated/0myFile.ser(权限被拒绝),它出现在以下行:FileOutputStream fos = new FileOutputStream(newFile);当我从其他意图调用它时,如下所示:User.serializeDataOut(addingUser);其中addingUser是有效的User对象.

在异常日志中看到(权限被拒绝)后,我要做的第一件事是进入清单并检查是否允许我的应用程序对存储进行读写,而实际上我确实这样做了.我的权限如下:

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

然后我读到一些人,如果他们有错误的路径,更确切地说不包括绝对路径,就会遇到此错误,然后我编辑了我的代码以包含Environment.getExternalStorageDirectory().getAbsolutePath();.部分,我很确定自己使用正确.

我还确保,因为我正在模拟器上进行测试,所以我启用了SD卡,并且模拟器具有SD文件夹.我检查了一下,确实确实有一个SD卡文件夹,并且我还在S8上测试了此应用程序,但遇到了同样的错误.

我到底在做什么错?我要做的就是保存一个User对象,然后在其他地方检索它,并且完全可以覆盖以前的文件,并且一次只保存一个User.

我可能还注意到了一些与之相关的事情:大约每3-5秒在我的Android监视器中,即使我杀死了我的应用程序,错误仍然不断弹出.该错误看起来像这样:onFatalError,处理来自engine(4)的错误
com.google.android.apps.gsa.shared.speech.a.g:从输入流中读取错误虽然我只能认为这不是问题的根源,但我只是想将其添加进来,以防万一.谢谢

解决方法:

您已在清单中添加了权限,所以我确定您不是在询问运行时权限.如果您使用的是SDK 23或更高版本,请询问运行时权限.供参考,我在这里添加一些代码段:

if(Build.VERSION.SDK_INT>22){
     requestPermissions(new String[] {YOUR_PERMISSIONS AS STRING}, 1);
}

并且要检查是否授予了权限,您需要使用onRequestPermissionResults()方法.

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (!(grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)) {
                Toast.makeText(addAlarm.this, "Permission denied to access your location.", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

标签:android,java,android-permissions
来源: https://codeday.me/bug/20191012/1900836.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有