android - 如何使用范围存储创建和删除公共文件,Android Q
问题描述
我们有一个发送彩信的应用程序。Android MmsManager 需要一个指向文件的 URI 参数。看来这个文件需要公开,否则 MmsService 会因为权限被拒绝而获得 Io 异常。因此,为了符合新的范围存储规则,我在 MediaStore DownLoads 文件夹中创建了一个 .dat 文件。这很好用,即使在 MediaStore 中存储 .dat 文件对我来说没有意义。但是彩信发送后,我需要删除这个文件。如果不征求用户许可或使用 android.permission.MANAGE_EXTERNAL_STORAGE,我看不到任何这样做的方法。要求用户允许删除他甚至不知道的文件显然是不好的。当然 android.permission.MANAGE_EXTERNAL_STORAGE 需要获得谷歌的许可才能使用,并且似乎只是为了能够删除由应用程序创建的数据文件。那么,有没有办法创建一个以后可以删除的公共文件。我已经知道 android:requestLegacyExternalStorage="true" 是一个非常临时的解决方案,而 Environment.getExternalStoragePublicDirectory 已被弃用。该文件是使用类似于下面的代码创建的。pdu 是先前创建的字节数组。
final String fileName = "send." + String.valueOf(Math.abs(mRandom.nextLong())) + ".dat";
ContentResolver contentResolver = mContext.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
Uri contentUri = contentResolver.insert(MediaStore.Files.getContentUri("external"), contentValues);
try {
writer = mContext.getContentResolver().openOutputStream(contentUri);
writer.write(pdu);
} catch (final IOException e) {
Log.e(TAG, "Error writing to output stream in MmsSender. e= ", e);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
Log.e(TAG, "IOException writing PDU file in MmsSender, e= " + e);
}
}
}
解决方案
如果您的应用可以使用媒体商店创建文件,那么您的应用也可以删除该文件。
推荐阅读
- asp.net-core - 修复“价格字段必须是数字”。在 Microsoft .NET Core / ASP.NET 教程中
- swift - 从 Firebase 集合和子集合循环中快速加载数据
- google-apps-script - Google 表格:更新现有行中的数据
- angular - 单击数据表行中的按钮时弹出模式
- extjs - 需要将表单显示为网格
- python - Jupyter Notebook 安装错误 - argon2-cffi (PEP 517) 的构建轮...错误
- php - PHP Cron计划作业未执行
- python-3.x - 太多的值无法解压(预期为 3)pygame 点击问题
- google-app-engine - Cloud Build 无法部署到 Google App Engine - 您无权充当 @appspot.gserviceaccount.com
- gnuplot - grep 文件中的值,然后将其用作文件夹名称来定位文件并绘图