无法写入外部存储,除非应用程序被授予权限后,重新启动 [英] Can't write to external storage unless app is restarted after granting permission

查看:411
本文介绍了无法写入外部存储,除非应用程序被授予权限后,重新启动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

应用程序无法写入到Android 6.0外置存储(我测试的仿真器),即使在WRITE_EXTERNAL_STORAG​​E已被授予在运行时;除非应用程序被终止并重新启动。

App unable to write to external storage on Android 6.0 (I'm testing on emulator), even after WRITE_EXTERNAL_STORAGE has been granted at runtime; unless the app is killed and restarted.

片段从AndroidManifest.xml中

Snippet from AndroidManifest.xml

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

build.gradle

build.gradle

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
    ......
    minSdkVersion 15
    targetSdkVersion 23
}

每当我需要写外部存储(备份),我检查我是否有权限。

Whenever I need to write to external storage (for backup) I check whether or not I have permission.

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                    getActivity().getBaseContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_RW_EXTERNAL_STORAGE);
                mPendingAction = PendingAction.Backup;
            } else {
                BackupRestoreService.startBackup(getActivity().getBaseContext());
            }

我也有以下

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.d("SettingsActivity", "grantResultsLength: " + grantResults.length);
        if (requestCode == PERMISSION_REQUEST_RW_EXTERNAL_STORAGE) {
            Log.d("SettingsActivity", "grantResultsLength: " + grantResults.length);
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                switch (mPendingAction) {
                    case Backup:
                        BackupRestoreService.startBackup(getActivity().getBaseContext());
                        mPendingAction = PendingAction.None;
                        break;
                    case Restore:
                        break;
                    default:
                }

            } else {
                Toast.makeText(getActivity(),
                        "Permission denied",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

在权限授予用户,下面的code

When the permission is granted by user, the following code

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), DIR_MY_PORTFOLIO);
if (!file.mkdirs())
        Log.d("Backup", "Unable to create directories");
final String outputFilename = new SimpleDateFormat("'Backup'-yyyyMMdd-hhmmss'.mpb'", Locale.US).format(new Date());
File outputFile = new File(getBackupStorageDir(), outputFilename);
Log.d("Backup", "Can write to file: " + outputFile.canWrite());
Log.d("Backup", "File exists: " + outputFile.exists());

生成

    in.whoopee.myportfolio D/Backup: Unable to create directories
    in.whoopee.myportfolio D/Backup: Can write to file: false
    in.whoopee.myportfolio D/Backup: File exists: false
    in.whoopee.myportfolio W/System.err: java.io.FileNotFoundException: /storage/09FD-2F0C/Download/My Portfolio/Backup-20151011-051318.mpb: open failed: EACCES (Permission denied)

如果,权限被授予后,应用程序被杀害并重新启动,一切都完美的备份文件在外部存储中创建。

If, after the permission is granted, the app is killed and restarted, everything goes perfect and backup file is created in external storage.

请建议我在做什么错。

推荐答案

成功检查权限授予后,添加以下行onRequestPermissionsResult()方法。

Add the following line in onRequestPermissionsResult() method after checking permission grant successfully.

android.os.Process.killProcess(android.os.Process.myPid());

编辑:查看您所设定的目标SDK版本23.if你已经做了这一点,它不工作(或者你不希望将其设置为23),可能比你去这个解决方案(杀应用程序)。

Check you have set the target sdk version to 23.if You already have done that and it is not working(or you don't want to set it to 23) than you may go with this solution(killing the app process).

这篇关于无法写入外部存储,除非应用程序被授予权限后,重新启动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆