首页 > 解决方案 > 如何使用范围存储创建和删除公共文件,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);
            }
        }
    }

标签: androiddelete-fileqscoped-storage

解决方案


如果您的应用可以使用媒体商店创建文件,那么您的应用也可以删除该文件。


推荐阅读