如何使用分区存储创建和删除公共文件,Android Q

How to create and delete public files using scoped storage, Android Q

提问人:sidetrail 提问时间:11/15/2021 更新时间:11/15/2021 访问量:336

问:

我们有一个发送彩信的应用程序。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);
            }
        }
    }
android 删除文件 q 范围存储

评论


答: 暂无答案