简体   繁体   English

有没有一种方法可以在Android上的“我的文件”(外部存储)中创建文件夹并将文件写入此文件夹?

[英]Is there a way to create a folder within My Files on Android (external storage) and write files to this folder?

I am coding an Android app (in Java) which uses OCR to convert handwriting into digital text. 我正在编写一个Android应用程序(使用Java),该应用程序使用OCR将手写内容转换为数字文本。 I am trying to take the String generated by the OCR function in my code and write it to a text file (the OCR portion is currently working). 我试图在代码中使用OCR函数生成的String并将其写入文本文件(OCR部分当前正在工作)。 I would then like to create a folder (in phone's external storage, for example My Files on Samsung) and add the text file to this folder, which contains only the files the user has created (which the user should be able to access and share). 然后,我想创建一个文件夹(在手机的外部存储中,例如Samsung上的“我的文件”),然后将文本文件添加到该文件夹​​中,其中仅包含用户创建的文件(用户应该可以访问和共享) )。

I have conducted some research on writing to phone's external storage (including other StackOverflow questions) but no tutorial has worked for me. 我已经进行了一些有关写手机外部存储的研究(包括其他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;

}

The code above is what I have, however after testing it, the AbsolutePath is null. 上面的代码是我所拥有的,但是在测试之后,AbsolutePath为null。 It does not seem to be creating a folder on the phone's external storage. 它似乎没有在电话的外部存储上创建文件夹。 How would I go about this so that a folder is created and I can add files to that folder? 我将如何处理以便创建文件夹并可以将文件添加到该文件夹​​?

Your code to create the directory is fine. 您创建目录的代码很好。

But there's a chance you're missing permissions due to newer versions of Android requiring a User's consent before you can write files to the external storage. 但是由于新版本的Android需要征得用户同意才能将文件写入外部存储,因此您可能会丢失权限。

First, make sure you have this permission in your Manifest.xml: 首先,请确保您在Manifest.xml中具有此权限:

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

Afterwards, since WRITE_EXTERNAL_STORAGE is listed as a Dangerous Permission, as seen here: https://developer.android.com/guide/topics/permissions/overview#normal-dangerous , you'll also need to explicitly request the permission from the user. 然后,由于WRITE_EXTERNAL_STORAGE被列为危险许可,如下所示: https : //developer.android.com/guide/topics/permissions/overview#normal-dangerous ,因此您还需要明确要求用户许可。

Finally, to request the permission: 最后,请求权限:

// 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
}

You'll also need to handle the response of the request: 您还需要处理请求的响应:

@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.
    }
}

The above code was copied from: https://developer.android.com/training/permissions/requesting 上面的代码复制自: https : //developer.android.com/training/permissions/requesting

You should read that link more thoroughly since it provides a good explanation of what you need to explain to the user, since users are typically very wary when Apps ask for permissions to modify files in their storage. 您应该更彻底地阅读该链接,因为它为您需要向用户解释的内容提供了很好的解释,因为当Apps要求修改存储中文件的权限时,用户通常会非常警惕。

You can try this, 你可以试试看

  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();
}

You have to add getWirtePermissionAndCreateDir() instead of writeFolder() in activity body. 您必须在活动正文中添加getWirtePermissionAndCreateDir()而不是writeFolder()

Below function will create folder and then create file in that folder and if folder already exists then simply create file. 下面的函数将创建文件夹,然后在该文件夹中创建文件,如果文件夹已经存在,则只需创建文件。

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;
}

You may need to check permissions so also define these functions. 您可能需要检查权限,因此还要定义这些功能。

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;
        }
    }
}

In your manifest file don't forget to add this line. 在清单文件中,不要忘记添加此行。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM