Android 扩展文件下载器 - 写入权限?

问题描述

我的 Android 扩展文件下载器不工作。我发现,问题发生了 在原始的 DownloadThread.java 中 我已确认已安装外部媒体。

传递的数据是正确的: byte[] 数据包含 bytesRead = 4096 字节。这些经过检查并从预期的 obb 文件中正确读取。 state.filename 也是绝对正确的。 state.mStream = null,因此必须先打开一个FileOutputStream。

new FileOutputStream(state.mFilename,true) 产生一个 IOException

private void writeDataToDestination(State state,byte[] data,int bytesRead)
        throws StopRequest {
    for (;;) {
        try {
            if (state.mStream == null) {
                state.mStream = new FileOutputStream(state.mFilename,true);
            }
            state.mStream.write(data,bytesRead);
            // we close after every write --- this may be too inefficient
            closeDestination(state);
            return;
        } catch (IOException ex) {
            if (!Helpers.isExternalMediaMounted()) {
                throw new StopRequest(DownloaderService.STATUS_DEVICE_NOT_FOUND_ERROR,"external media not mounted while writing destination file");
            }

应该授予 WRITE_EXTERNAL_STORAGE 权限:AndroidManifest.xml:

...
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />

...
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name_short"
        android:supportsRtl="true"
        android:requestLegacyExternalStorage="true"
        android:preserveLegacyExternalStorage="true"
        android:theme="@style/AppTheme">
...

还有我的 build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
    useLibrary 'org.apache.http.legacy'

    signingConfigs {
        Signed {
            keyAlias ...
            keyPassword ...
            storeFile file(...)
            storePassword ...
        }
    }

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 30
        ndk {
            debugSymbolLevel 'FULL'
        }
    }
...

我完全卡住了,无法继续。我能做什么?

解决方法

您应该请求许可

 private void checkWriteStoragePermission()
{
    ArrayList<String> permissions = new ArrayList<>();
    if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
    {
        permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
    {
        permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
    }

    if (permissions.size() > 0)
    {
        ActivityCompat.requestPermissions(this,permissions.toArray(new String[permissions.size()]),Constants.WRITE_EXTERNAL_STORAGE());
    }
    
}

并使用 REQUEST_INSTALL_PACKAGES 权限它可以访问 Android/obb 目录。

,

G-o-o-g-l-e,如果你自己不能把obb文件保存到obb目录下,那我就不用了。我现在已经为它找到了另一个可以由我的应用写入的目录。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...