首页 > 解决方案 > 有没有办法在 Android 上的“我的文件”(外部存储)中创建一个文件夹并将文件写入该文件夹?

问题描述

我正在编写一个使用 OCR 将手写内容转换为数字文本的 Android 应用程序(Java 中)。我试图在我的代码中获取由 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 为空。它似乎没有在手机的外部存储上创建文件夹。我将如何做才能创建一个文件夹并将文件添加到该文件夹​​?

标签: javaandroidandroid-studioiostorage

解决方案


您创建目录的代码很好。

但是,由于较新版本的 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

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


推荐阅读