【问题标题】:file.createFile does not work. Android 10file.createFile 不起作用。安卓 10
【发布时间】:2020-07-02 21:35:52
【问题描述】:
 val filePath = getString(R.string.file_path)
    val file = File(filePath)
    var lines: List<String?> = ArrayList()
    if(!file.exists()) {
            try {
               if (Environment.getExternalStorageState()==Environment.MEDIA_MOUNTED) {

                   file.createNewFile()
               }
            } catch (e: IOException) {
                AlertDialog.Builder(this)
                    .setTitle(getString(R.string.No_records_file))
                    .setMessage(getString(R.string.cant_create_file))
                    .setNeutralButton(
                        R.string.Exit
                    ) { dialog, id -> finish() }.show()
            }
        }

它适用于 Android 8.0.0、9.0。我不确定android,但是这个问题出现在Mi9T pro上

【问题讨论】:

  • file.createNewFile() 在 Android 10 下仍然可用。但并非适用于所有路径。而且你没有告诉你的路径。
  • 在“/storage/emulated/0/Documents”文件夹中创建文件,如果不存在则创建该文件夹。据我了解,系统只允许访问“下载”文件夹
  • 正如我所写,它适用于 10 以下的 android 版本。对于 10 岁及以上,我必须使用其他东西。我看例子不多,有什么可以帮助理解的
  • 奇怪的是你不问你还可以使用哪些路径。
  • 好的,我明天去查。那么有一条或多条路径可用?

标签: android kotlin local-storage


【解决方案1】:

使用 Android Q,您无法再直接访问文件系统。请改用 SAF(存储访问框架)。

【讨论】:

  • 我可以像以前一样向提供者授予权限并使用文件吗?
  • 不,你不能。而且,当 SAF 询问用户他想将文件存储在哪里时,您不再需要 WRITE_ACCESS 权限。 SAF 充当您可能已经知道的 Java JFileChooser 类。
  • SAF 让用户使用 UI?所有示例都是关于我的应用程序中这个不必要的功能。但是市场上的许多应用程序都是在没有此 ui 对话框的情况下创建文件夹和文件。是使用 DocumentProvider 吗?
  • 可以,但如果您只想使用内部存储或 SD 卡,则不需要实现派生自它的类。
  • 如果我不会创建数据库,我还需要抛出 SAF 吗?
【解决方案2】:

在 Android API 29 上,不推荐使用 getExternalStorageDirectory,您应该改用 getExternalFilesDir。

【讨论】:

    【解决方案3】:

    先添加这条规则;

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

    向活动请求权限;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    
        //ASK HERE...
        if (shouldAskPermissions()) {
            askPermissions();
        }
    
    }
    

    -

      //// ASK METHODS
        protected boolean shouldAskPermissions() {
            return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
        }
    
        protected void askPermissions() {
            String[] permissions = {
                    "android.permission.READ_EXTERNAL_STORAGE",
                    "android.permission.WRITE_EXTERNAL_STORAGE"
            };
            int requestCode = 200;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(permissions, requestCode);
            }
        }
    

    然后创建文件使用此代码;

            File directory = new File(Environment.getExternalStorageDirectory()+java.io.File.separator +"AppName");
    
                 try{
                         if(!directory.exists()) {
                             System.out.println("Directory created");
                             directory.mkdirs();
                         } else {
                             System.out.println("Directory is not created");
                         }
    
                         File f = new File(directory.getPath()+"/"+ "ENTER_FILE_NAME" + ".jpg");
                         f.createNewFile();
                         FileOutputStream fo = new FileOutputStream(f);
                         fo.write(bytes.toByteArray());
                         fo.close();
    
                         System.out.println("FILE PATH:" + f.getPath());
    
                     }catch(Exception e){
                         e.printStackTrace();
                     }
    

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多