运行时授予WRITE_EXTERNAL_STORAGE权限后,应用程序无法访问SD卡

3
在Android M中,当权限在运行时被授予时,访问SD卡需要手动停止和启动应用程序,如何以编程方式实现?
但是,如果强制停止并重新启动应用程序,则可以访问SD卡。
AndroidManifest.xml:
uses-permission-sdk-m android:name="android.permission.WRITE_EXTERNAL_STORAGE


     /* **Checking permission **
        if doesn't have request
         else
         browse file directory       
    */

    String[] perm = { Manifest.permission.WRITE_EXTERNAL_STORAGE };
    if (checkSelfPermission(perm[0]) == PackageManager.PERMISSION_DENIED) {


                    requestPermissions(perm, REQ);

                } else {

                    Explore(); //method to browse file directory
                }

onRequestPermissionsResult

   @Override
public void onRequestPermissionsResult(int requestCode,
        String[] permissions, int[] grantResults) {
    // TODO Auto-generated method stub

    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  

   //Not able to browse SD card until restart application


       Explore(); //method to browse file directory


    } else {
        Log.i("onRequestPermissionsResult", " Request denied");
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

我已经为此创建了一个库。使用简单步骤轻松上手。 https://github.com/Kishanjvaghela/Ask-Permission - Kishan Vaghela
2个回答

9

您需要重新启动应用程序以获取WRITE_EXTERNAL_STORAGE权限(和其他一些权限)。这是因为此权限实际上是Linux权限。Android的最新预览版本在这种情况下不会重新启动应用程序,但是谷歌可能会稍后添加它。

您可以使用以下代码进行重新启动:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // Write external store permission requires a restart
    for (int i = 0; i < permissions.length; i++)
        if (Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permissions[i]) &&
                grantResults[i] == PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG, "Restarting application");

            // Schedule start after 1 second
            PendingIntent pi = PendingIntent.getActivity(
                    this,
                    0,
                    getIntent(),
                    PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, pi);

            // Stop now
            System.exit(0);
        }
}

编辑:您可以在此处找到与Linux权限相关联的Android权限列表:https://android.googlesource.com/platform/frameworks/base/+/master/data/etc/platform.xml


尝试了零毫秒延迟,它仍然有效,因此也许不需要担心在 System.exit(0) 完成之前 Alarm 触发的(非常不可能的)竞态条件。无论如何,我正在使用您的 1000 毫秒延迟作为额外保险。 - Carl

0

您可以使用以下条件检查SD卡是否可用

if (android.os.Environment.getExternalStorageState().equals(
        android.os.Environment.MEDIA_MOUNTED)) {

 //Check for the file
 File appFolder = new File(Environment.getExternalStorageDirectory() + File.separator
            + context.getString(R.string.app_name));

 boolean exist = appFolder.exists();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接