我在React Native android中下载和查看PDF流时遇到问题。
第一步:在按钮上单击
getBill = () => {
if (Platform.OS === "android") {
this.getAndroidPermission();
} else {
this.downloadBill();
}
};
第二步(如果是android):
getAndroidPermission = async () => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
);
const grantedRead = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE
);
if (
granted === PermissionsAndroid.RESULTS.GRANTED &&
grantedRead === PermissionsAndroid.RESULTS.GRANTED
) {
this.downloadBill();
} else {
Alert.alert(
"Permission Denied!",
"You need to give storage permission to download the file"
);
}
} catch (err) {
console.warn(err);
}
};
第三步:
downloadBill = async () => {
this.setState({ loading: true });
let billId = this.state.billId;
let user = await AsyncStorage.getItem("user");
let parseUser = JSON.parse(user);
let userToken = parseUser.token;
RNFetchBlob.config({
addAndroidDownloads: {
useDownloadManager: true,
notification: true,
path:
RNFetchBlob.fs.dirs.DownloadDir +
"/" +
`billID_${this.state.billId}.pdf`,
mime: "text",
description: "File downloaded by download manager.",
appendExt: "pdf",
trusty: true,
},
})
.fetch("GET", `${config.apiUrl}/crm/getbillfile/${billId}`, {
Authorization: "Bearer " + userToken,
})
.then((resp) => {
let pdfLocation =
RNFetchBlob.fs.dirs.DocumentDir +
"/" +
`billID_${this.state.billId}.pdf`;
RNFetchBlob.fs.writeFile(pdfLocation, resp.data, "base64");
FileViewer.open(pdfLocation, {
onDismiss: () => this.setState({ loading: false }),
});
});
};
我已在android清单文件中添加了以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
当我运行代码时,它将在正确的位置下载文件,但显示警告,指出base64损坏,PDF显示为无效。上面的代码在iOS上运行良好。
答案 0 :(得分:0)
如果您使用的是Android 8或更高版本,则需要将usesCleartextTraffic
添加到AndroidManifest
中,这也许就是您的解决方案:)
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>