问题描述
我的 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目录下,那我就不用了。我现在已经为它找到了另一个可以由我的应用写入的目录。