【问题标题】:Is there a way to create a folder within My Files on Android (external storage) and write files to this folder?有没有办法在 Android 上的“我的文件”(外部存储)中创建一个文件夹并将文件写入该文件夹?
【发布时间】:2019-06-07 12:06:12
【问题描述】:

我正在编写一个 Android 应用程序(用 Java 编写),它使用 OCR 将手写内容转换为数字文本。我试图在我的代码中获取由 OCR 函数生成的字符串并将其写入文本文件(OCR 部分当前正在工作)。然后我想创建一个文件夹(在手机的外部存储中,例如三星上的我的文件)并将文本文件添加到该文件夹​​中,该文件夹仅包含用户创建的文件(用户应该能够访问和共享)。

我对写入手机的外部存储进行了一些研究(包括其他 StackOverflow 问题),但没有任何教程对我有用。

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}


public File writeFolder ()

{

    File file = null;

    if (isExternalStorageWritable())

    {
        // Get the directory for the user's public directory.
       file = new File(Environment.getExternalStorageDirectory() + File.separator + "OCR Documents");

    }

    if (!file.mkdirs())
        Log.e(LOG_TAG, "Directory not created");

    else
        System.out.println(file.getAbsolutePath());

    return file;

}

上面的代码是我所拥有的,但是经过测试,AbsolutePath 为空。它似乎没有在手机的外部存储上创建文件夹。我将如何做才能创建一个文件夹并将文件添加到该文件夹​​?

【问题讨论】:

    标签: java android android-studio io storage


    【解决方案1】:

    您创建目录的代码很好。

    但您可能会丢失权限,因为较新版本的 Android 需要用户同意才能将文件写入外部存储。

    首先,确保您在 Manifest.xml 中具有此权限:

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

    之后,由于 WRITE_EXTERNAL_STORAGE 被列为危险权限,如下所示:https://developer.android.com/guide/topics/permissions/overview#normal-dangerous,您还需要明确请求用户的权限。

    最后,请求权限:

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
    
        // Permission is not granted
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
        } else {
            // No explanation needed; request the permission
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    
            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    } else {
        // Permission has already been granted
    }
    

    您还需要处理请求的响应:

    @Override
    public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }
    

    以上代码复制自:https://developer.android.com/training/permissions/requesting

    您应该更彻底地阅读该链接,因为它很好地解释了您需要向用户解释的内容,因为当应用程序请求修改其存储中的文件的权限时,用户通常会非常谨慎。

    【讨论】:

      【解决方案2】:

      你可以试试这个,

        private void getWirtePermissionAndCreateDir() {
          if (Build.VERSION.SDK_INT < 23) {
              createDir();
      
          } else {
              final String[] PERMISSIONS_STORAGE = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
              //Asking request Permissions
              ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, 9);
          }
      }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      
          boolean writeAccepted = false;
          switch (requestCode) {
              case 9:
                  writeAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                  break;
          }
          if (writeAccepted) {
              createDir();
          } else {
              Toast.makeText(MainActivity.this, "You don't assign permission.", Toast.LENGTH_LONG).show();
          }
      }
      
      private void createDir(){
          File file = new File(Environment.getExternalStorageDirectory() + File.separator + "OCR Documents");
          file.mkdirs();
          Toast.makeText(MainActivity.this, file.getAbsolutePath(), Toast.LENGTH_LONG).show();
      }
      

      您必须在活动正文中添加getWirtePermissionAndCreateDir() 而不是writeFolder()

      【讨论】:

        【解决方案3】:

        以下函数将创建文件夹,然后在该文件夹中创建文件,如果文件夹已经存在,则只需创建文件。

        private FileOutputStream fos;
        
        //Function: create a file in a folder
        private boolean createFileInFolder(String fileName, String folderName) {
            if (isExternalStorageWritable()) {
                String path = Environment.getExternalStorageDirectory() + "/" + folderName;
                File folder = new File(path);
                if (!folder.exists()) {
                    folder.mkdirs();
                }
                txtFile = new File(path, fileName);
                try {
                    fos = new FileOutputStream(txtFile);
                    return true;
                } catch (IOException e) {
                    Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
                    return false;
                }
            } else
                return false;
        }
        
        //Function: IsExternalStorageWritable?
        public boolean isExternalStorageWritable() {
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) {
                return true;
            }
            return false;
        }
        

        您可能需要检查权限,因此还要定义这些函数。

        private boolean permission;
        private final int MY_PERMISSIONS_REQUEST = 10;
        
        //Function: checkPermission
        private void checkPermission() {
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST);
        
            } else {
                permission = true;
            }
        
        }
        
        //Function: Permission Request Results
        @Override
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST: {
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        permission = true;
                    } else {
                        permission = false;
                    }
                    return;
                }
            }
        }
        

        在你的清单文件中不要忘记添加这一行。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-17
          • 1970-01-01
          • 2020-11-17
          • 2021-11-24
          • 2016-07-21
          • 2015-07-17
          相关资源
          最近更新 更多