【问题标题】:Can not create the application private directory in Android API 23 (Google Nexus 6p) [duplicate]无法在 Android API 23(Google Nexus 6p)中创建应用程序私有目录 [重复]
【发布时间】:2015-12-12 21:54:26
【问题描述】:

我试图在 android api 23 (Google Nexus 6p) 设备中创建应用程序私有目录,但它给出了如下异常:ENOENT (no such file or directory) 但低于这意味着低于 API 6 它工作正常并且成功创建文件夹。任何人都可以帮助解决这个问题?我正在使用以下方法创建私有目录

private void createDirectory() {
        try {
           String s = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Android" + File.separator
                    + "data" + File.separator + getPackageName();
            File dir = new File(s);
            if (dir.mkdir()) {
                System.out.println("Directory created");
            } else {
                System.out.println("Directory is not created");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("FILE", "Error Package name not found ", e);
        }
    }

也使用 android manifest 权限:

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

如果是权限错误,那么如果我在“/storage/0/Android/com.test”这个文件夹中手动创建我的应用程序包文件夹,那么该目录中的其他文件可以成功创建。但我无法在 Android API 级别 23 中以编程方式创建“/storage/0/Android/com.test”。

我阅读了 Android M 新运行时权限指南,但我找不到任何目录创建级别权限。

【问题讨论】:

  • @ArturSzymański :我阅读了 Android M 新运行时权限指南,但找不到任何目录创建级别权限。
  • 您的示例代码目前不使用它们。

标签: android


【解决方案1】:

两个选项:

1/ 您不需要针对 23 Sdk 版本。您可以将 targetSdkVersion 降级到 22。您的应用程序将像以前一样运行,安装时将提示用户授予权限。需要注意的是,Android 6 用户稍后可以在应用设置中拒绝权限,从而导致应用出现不良行为。

2/ 您需要以 23 Sdk 版本为目标。在这种情况下,您需要提示 Android 6 用户授予权限。这里是一个 Activity 示例(部分代码):

public class MyActivity extends AppCompatActivity {  

private static final int EXTERNAL_STORAGE_REQUEST_CODE = 123;

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Prompt Android 6 user if permission is not yet granted
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQUEST_CODE);
        } else {
            createDirectory();
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case EXTERNAL_STORAGE_REQUEST_CODE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    createDirectory();
                } else {
                    Toast.makeText(this,  "Read/Write External Storage Not Granted", Toast.LENGTH_LONG).show();
                }
        }
    }

    private void createDirectory() {
    // unchanged
    }
}

【讨论】:

    【解决方案2】:

    自 Android 6.0 以来权限管理发生了变化: http://developer.android.com/training/permissions/requesting.html

    尝试在 Settins/Apps/YourApp/Permissions 中为您的应用手动启用存储权限

    enter image description here

    【讨论】:

    • 任何与写入外部存储相关的权限?如果有那么我该如何向用户询问?请提供样品
    • 看看我上面的新帖子
    猜你喜欢
    • 2017-01-05
    • 2016-05-16
    • 2016-05-11
    • 2013-06-20
    • 2018-02-15
    • 2018-04-05
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多