【问题标题】:Directory creation not working in Marshmallow Android目录创建在 Marshmallow Android 中不起作用
【发布时间】:2016-11-03 15:16:15
【问题描述】:

我在本机应用程序中创建目录。它在 Android 5.0 中运行良好,但在 Android 6.0 (Marshmallow) 中有时它有效,有时没有。我正在使用以下代码创建新目录。我正在保存视频和目录中的图像文件。

 public static void createApplicationFolder() {
    File f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME);
    f.mkdirs();
    f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + Config.VIDEO_COMPRESSOR_COMPRESSED_VIDEOS_DIR);
    f.mkdirs();
    f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + Config.VIDEO_COMPRESSOR_TEMP_DIR);
    f.mkdirs();

}

【问题讨论】:

  • 在 android M 中你需要一个请求权限。
  • 我已经在清单中添加了权限,还尝试了运行时权限。但它不起作用。还有其他方式吗?
  • 是的,你应该要求那个
  • @Csharp 看看我编辑的答案

标签: java android android-6.0-marshmallow


【解决方案1】:
public class MyDevIDS extends AppCompatActivity {

        private static final int REQUEST_RUNTIME_PERMISSION = 123;

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

            if (CheckPermission(MyDevIDS.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // you have permission go ahead
                createApplicationFolder();
            } else {
                // you do not have permission go request runtime permissions
                RequestPermission(MyDevIDS.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION);
            }
        }

        @Override
        public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {

            switch (permsRequestCode) {

                case REQUEST_RUNTIME_PERMISSION: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // you have permission go ahead
                        createApplicationFolder();
                    } else {
                        // you do not have permission show toast.
                    }
                    return;
                }
            }
        }

        public void RequestPermission(Activity thisActivity, String Permission, int Code) {
            if (ContextCompat.checkSelfPermission(thisActivity,
                    Permission)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                        Permission)) {
                } else {
                    ActivityCompat.requestPermissions(thisActivity,
                            new String[]{Permission},
                            Code);
                }
            }
        }

        public boolean CheckPermission(Context context, String Permission) {
            if (ContextCompat.checkSelfPermission(context,
                    Permission) == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                return false;
            }
        }
    }

【讨论】:

  • @Csharp 不客气,如果有帮助请打勾。
【解决方案2】:

在 Android M 上运行的设备,您不能直接将数据写入存储。你需要获得许可。

this 链接可能会有所帮助

所以这里应该在运行时询问WRITE_EXTERNAL_STORAGE 的权限。

public  boolean permissions() {
//cheeck id device is Android M 

 if (Build.VERSION.SDK_INT >= 23) {
    if(checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        //your permission is granted
        return true;
    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        return false;
    }
}
else {
 //permission is automatically granted on devices lower than android M upon installation

    return true;
}
}

您还需要重写 onRequestPermissionsResult() 回调方法。你可以在这里添加逻辑。

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults[0]== PackageManager.PERMISSION_GRANTED){

    //Add your logic of saving a file to directory. 
}

}

希望对你有帮助:)

【讨论】:

  • 请从参考链接中添加相关代码。将来,此链接可能会更改,从而使答案对未来的访问者无用。
  • 它是否也适用于 READ_EXTERNAL_STORAGE ?
【解决方案3】:

在 Android Marshmallow 中,您需要在运行时请求 dangerous permissions,包括 STORAGE 权限组。 我知道一个不错的库,可以让你的生活更轻松,RxPermissions

你可以用很少的代码请求权限:

RxPermissions.getInstance(this)
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(granted -> {
    if (granted) { // Always true pre-M
       // I can write to the storage now
    } else {
       // Oups permission denied
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多