2

我想在我的手机中创建一个“RawMeasurement”目录,与 Android R 下的音乐、文档、图片...相同的位置

我用较低的 api 版本进行了测试,它可以工作,但在 android R 下,不可能。

我认为问题来自Environement.getExternalStorageDirectory()

我一直在寻找其他方法,但没有结果。

想法?先感谢您

public void save(){

    String state;
    state = Environment.getExternalStorageState();

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm", Locale.getDefault());
    String currentDateAndTime = sdf.format(new Date());

    if(Environment.MEDIA_MOUNTED.equals(state)){
        File Dir  = new File(Environment.getExternalStorageDirectory().getPath(),"RawMeasurement");
        if(!Dir.exists()) {
            Dir.mkdirs();
            Toast.makeText(getContext(),"new folder",Toast.LENGTH_LONG).show();
        }
        File file = new File(Dir,"RawMeasurements"+currentDateAndTime+".txt");
        String message = "bla bla bla  " ;
        try{
            FileOutputStream out = new FileOutputStream(file);
            out.write(message.getBytes());
            out.close();
            Toast.makeText(getContext(),"message saved",Toast.LENGTH_LONG).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            logError("error");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }else{
        Toast.makeText(getContext(),"echec",Toast.LENGTH_LONG).show();
    }

}
4

3 回答 3

2

应用程序无法在 Android 11 的外部存储上创建自己的应用程序特定目录。您可以在公共目录中创建文件夹。例如在 Documents 文件夹中。

final File dir;
if (Build.VERSION_CODES.R > Build.VERSION.SDK_INT) {
    dir = new File(Environment.getExternalStorageDirectory().getPath()
            + "//MyApp");
} else {
    dir = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getPath()
            + "//MyApp");
}

if (!dir.exists())
    dir.mkdir();
于 2021-03-18T10:08:59.067 回答
1

自 android R 以来的权限系统发生了一些变化,有关详细信息,请参阅官方文档中的 Android 11 中的存储更新。

我用于externalMediaDirs.first()自己的项目,但这会将文件放入Android/Media/com.example/

于 2020-04-30T17:13:05.307 回答
1

我想在我的手机中创建一个“RawMeasurement”目录,与 Android R 下的音乐、文档、图片...相同的位置

抱歉,但这并不真正受支持。您可以请求MANAGE_EXTERNAL_STORAGE许可,此时您可以做您想做的事。我的猜测是,除非您能够为该许可提供非常好的理由,否则 Google 会禁止您的应用进入 Play 商店。

Google 希望您做的是ACTION_OPEN_DOCUMENT_TREE让用户决定您的应用应将用户的原始测量值放在用户设备上的哪个位置。然后,您可以在用户选择的位置下创建一个子树(目录),然后您可以将您的内容放入该子树中。

于 2020-04-30T17:19:35.180 回答