提问人:sidetrail 提问时间:11/15/2021 更新时间:11/15/2021 访问量:336
如何使用分区存储创建和删除公共文件,Android Q
How to create and delete public files using scoped storage, Android Q
问:
我们有一个发送彩信的应用程序。Android MmsManager 需要指向文件的 URI 参数。似乎此文件需要是公共的,否则 MmsService 会因权限被拒绝而获得 Io 异常。因此,为了符合新的范围存储规则,我在 MediaStore DownLoads 文件夹中创建了一个 .dat 文件。这工作正常,即使将 .dat 文件存储在 MediaStore 中对我来说没有意义。但是在发送彩信后,我需要删除这个文件。我看不到任何方法,除非征得用户的许可或使用android.permission.MANAGE_EXTERNAL_STORAGE。要求用户允许删除他甚至不知道的文件显然是不好的。当然,android.permission.MANAGE_EXTERNAL_STORAGE需要 Google 的许可才能使用,并且似乎有点矫枉过正,只是为了能够删除应用程序创建的数据文件。那么,有没有办法创建一个以后可以删除的公共文件。我已经知道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);
}
}
}
答: 暂无答案
评论