java - 有没有办法在 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 为空。它似乎没有在手机的外部存储上创建文件夹。我将如何做才能创建一个文件夹并将文件添加到该文件夹?
解决方案
您创建目录的代码很好。
但是,由于较新版本的 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
您应该更彻底地阅读该链接,因为它很好地解释了您需要向用户解释的内容,因为当应用程序请求修改其存储中的文件的权限时,用户通常非常谨慎。
推荐阅读
- excel - 使用 VBA 连接到 Sqlite 数据库
- python - 检查链表是否为回文。找不到问题
- python - Visbrain PyQt5 导入错误
- php - MySQL 在 php foreach 循环中仅插入几行
- json - 如何在highchart中用json划分系列的两列
- daemon - 如何将程序作为守护进程运行?
- java - Java Spark:GroupBy 上的堆栈溢出错误
- c# - 从 Delphi 调用 C# Dll-Export - 使用字符串作为参数的回调 - Robert Giesecke DLLExport
- pact - 是否可以定义协议以匹配属性的类型而不是值?
- python - 将元组的嵌套列表转换为元组中第一个元素的嵌套列表