Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.io.FileNotFoundException: (Permission denied) when writing an object using ObjectOutputStream

I have been trying to work around this for several hours and I am extremely frustrated so I am coming to you guys for some guidance.

I am trying to save and retrieve a User object I have created. I want to make it so that I can save and retrieve this User object from any intent throughout my application, so I decided to go with a FileInput and Output stream. I have included my code for both below.

Here is my output data method:

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();
    }
}

And here is my input data method:

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;
    }
}

Note: both of these methods reside inside my User class, which also implements Serializable.

The whole error with the file path looks like this: java.io.FileNotFoundException: /storage/emulated/0myFile.ser (Permission denied) and it appeared at this line: FileOutputStream fos = new FileOutputStream(newFile); when I called it from a different intent like so: User.serializeDataOut(addingUser); in which addingUser was a valid User object.

The first thing I did after seeing (Permission denied) in the exception log, was go into my manifest and check if I was allowing my application to read and write to storage, which I did in fact do. I have included my permissions below:

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

Then I read that some people were having this error if they had the wrong path, more specifically not including the absolute path, which I then edited my code to include the Environment.getExternalStorageDirectory().getAbsolutePath(); part, which I am pretty sure I am using correctly.

I also made sure that, since I am testing this on an emulator, that I had enabled an SD card and the emulator had an SD folder. I checked and it indeed did have an SD card folder, and I also tested this application on an S8 and I got the same error.

What exactly am I doing wrong here? All I want to do is save one User object and retrieve it somewhere else, and I am perfectly ok with a previous file being overwritten and only having one User saved at a time.

Also something that is probably related I just noticed: about every 3-5 seconds in my Android Monitor, an error keeps on popping up non stop even after I kill my application. The error looks like this: onFatalError, processing error from engine(4) com.google.android.apps.gsa.shared.speech.a.g: Error reading from input stream Although I can only assume this isn't the source of the problem, I just wanted to add it in, in case it could help. Thanks

like image 987
cjnash Avatar asked Jun 28 '17 17:06

cjnash


3 Answers

You've added the permission in manifest, So I'm sure you are not asking runtime permissions. If you are using SDK 23 or higher, Ask runtime permission. For reference I'm adding some snippet here:

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

and to check whether permission is granted or not, you need to use onRequestPermissionResults() method.

@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();
            }
        }
    }
}
like image 142
Kaushal28 Avatar answered Sep 22 '22 19:09

Kaushal28


This java.io.FileNotFoundException: /storage/emulated/0myFile.ser looks like you are missing a '/' in the path.

Use

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + '/';
like image 34
P.J.Meisch Avatar answered Sep 22 '22 19:09

P.J.Meisch


Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running

Everything you need to know is in :

https://developer.android.com/training/permissions/requesting.html

The other error has nothing to do with it

like image 31
yanivtwin Avatar answered Sep 23 '22 19:09

yanivtwin