EACCESS Permission denied in Android

淺唱寂寞╮ 提交于 2019-11-28 00:08:32
Ziteng Chen

As I remember Android got a partial multi-storage support since Honeycomb, and the primary storage (the one you get from Environment.getExternalStorageDirectory, usually part of the internal eMMC card) is still protected by the permission WRITE_EXTERNAL_STORAGE, but the secondary storages (like the real removable SD card) are protected by a new permission android.permission.WRITE_MEDIA_STORAGE, and the protection level is signatureOrSystem, see also the discussion in this article.

If this is the case then it seems impossible for an normal app to write anything to the real sdcard without a platform signature...

Sachin

From API level 19, Google has added API.

  • Context.getExternalFilesDirs()
  • Context.getExternalCacheDirs()
  • Context.getObbDirs()

Apps must not be allowed to write to secondary external storage devices, except in their package-specific directories as allowed by synthesized permissions. Restricting writes in this way ensures the system can clean up files when applications are uninstalled.

Following is approach to get application specific directory on external SD card with absolute paths.

Context _context = this.getApplicationContext();

File fileList2[] = _context.getExternalFilesDirs(Environment.DIRECTORY_DOWNLOADS);

if(fileList2.length == 1) {
    Log.d(TAG, "external device is not mounted.");
    return;
} else {
    Log.d(TAG, "external device is mounted.");
    File extFile = fileList2[1];
    String absPath = extFile.getAbsolutePath(); 
    Log.d(TAG, "external device download : "+absPath);
    appPath = absPath.split("Download")[0];
    Log.d(TAG, "external device app path: "+appPath);

    File file = new File(appPath, "DemoFile.png");

    try {
        // Very simple code to copy a picture from the application's
        // resource into the external file.  Note that this code does
        // no error checking, and assumes the picture is small (does not
        // try to copy it in chunks).  Note that if external storage is
        // not currently mounted this will silently fail.
        InputStream is = getResources().openRawResource(R.drawable.ic_launcher);
        Log.d(TAG, "file bytes : "+is.available());

        OutputStream os = new FileOutputStream(file);
        byte[] data = new byte[is.available()];
        is.read(data);
        os.write(data);
        is.close();
        os.close();
    } catch (IOException e) {
        // Unable to create file, likely because external storage is
        // not currently mounted.
        Log.d("ExternalStorage", "Error writing " + file, e);
    }
}

Log output from above looks like:

context.getExternalFilesDirs() : /storage/extSdCard/Android/data/com.example.remote.services/files/Download

external device is mounted.

external device download : /storage/extSdCard/Android/data/com.example.remote.services/files/Download

external device app path: /storage/extSdCard/Android/data/com.example.remote.services/files/
satya522

I solved this problem by removing the android:maxSdkVersion="18" in uses-permission in manifest file. I.e. use this:

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

instead of:

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

Check if user is having external storage permission or not. If not then use cache dir for saving the file.

final boolean extStoragePermission = ContextCompat.checkSelfPermission(
               context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED;

            if (extStoragePermission &&
        Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) {
                parentFile = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
            }
            else{
                parentFile = new File(context.getCacheDir(),    Environment.DIRECTORY_PICTURES);
            }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!