rn-fetch-blob actionViewIntent()在Android 8.1手机上不起作用?

时间:2019-12-06 10:56:28

标签: android react-native

代码

import RNFetchBlob from 'rn-fetch-blob';

      RNFetchBlob.android
        .actionViewIntent(
          '/storage/emulated/0/Android/data/aaa.bbb.ccc/files/184.apk',
          'application/vnd.android.package-archive',
        )
        .then(() => {
          console.log('success');
        })
        .catch(err => {
          console.log('error');
        });

在模拟器中,以上代码正常工作,并弹出安装APK界面

在手机(Android 8.1)上,屏幕闪烁白色,然后没有任何内容,并且无法弹出安装界面,没有错误消息

2 个答案:

答案 0 :(得分:0)

找出原因,这是库的一个已知错误,并且有一个PR等待合并(回购所有者没有时间表)。这是PR的链接:https://github.com/joltup/rn-fetch-blob/pull/317

因此,基本上,这需要添加到文件android / src / main / java / com / RNFetchBlob / RNFetchBlob.java的第122-123行:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 如果以上方法均无效,请执行以下步骤:覆盖android / src / main / java / com / RNFetchBlob / RNFetchBlob.java中的121行:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 121行 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 122行

答案 1 :(得分:0)

您应该在AndroidMainFest.xml中添加权限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

但是由于它是动态权限,因此建议您每次下载并安装APK之前先检查一下它是否具有权限。

在这种情况下,您可以编写一个本机模块,对于动态检查权限,您可以在进入权限集页面后看到此answer

您还可以使用react-native-permission库。

requestInstallUpdate = async () =>  {
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.REQUEST_INSTALL_PACKAGES,
      {
        'title': 'Test App',
        'message': 'Test App needs to install updates.'
      }
    )
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      console.log("You can now install updates")
      return true;
    } else {
      console.log("App install permission denied")
      return false;
    }
  } catch (err) {
    console.warn(err)
    return false;
  }
}

然后使用您的下载方法

let canInstall = await requestInstallUpdate() 
if(canInstall){
  //download apk
}