Android 29/Q上MediaScanner scanFile/CameraRoll的替代方案
Google Play Store使用清单标志Android 29/Q上MediaScanner scanFile/CameraRoll的替代方案,android,react-native,react-native-android,mediastore,scoped-storage,Android,React Native,React Native Android,Mediastore,Scoped Storage,Google Play Store使用清单标志requestLegacyExternalStorage,对Android范围内的应用程序存储提出了新的要求 我的应用程序正在使用不支持作用域存储(并且需要requestLegacyExternalStorage标志才能工作)且时间非常短(2021年5月5日)。CameraRoll还有其他选择吗? 这里的目标是在用户图库应用程序中显示图像,如谷歌照片或供应商默认图库,而无需在用户端执行额外操作 原始谷歌播放消息: 从5月5日开始,您必须让我们知道为
requestLegacyExternalStorage
,对Android范围内的应用程序存储提出了新的要求 我的应用程序正在使用不支持作用域存储(并且需要
requestLegacyExternalStorage
标志才能工作)且时间非常短(2021年5月5日)。CameraRoll还有其他选择吗?
这里的目标是在用户图库应用程序中显示图像,如谷歌照片或供应商默认图库,而无需在用户端执行额外操作
原始谷歌播放消息:
从5月5日开始,您必须让我们知道为什么您的应用程序需要广泛的存储访问权限APPNAME 14 avr。2021 19:26
我们检测到您的应用程序在1个或多个应用程序捆绑包或APK的清单文件中包含requestLegacyExternalStorage标志。
在运行Android 11+的设备上运行应用程序的开发人员必须使用作用域存储,以便用户更好地访问其设备存储。要在5月5日之后在Android 11或更高版本上发布应用程序,您必须:
更新应用程序,以使用更隐私友好的最佳做法,如存储访问框架或媒体商店API
更新你的应用程序,在清单文件中声明所有文件访问(管理外部存储)权限,并从5月5日起在Play Console中完成所有文件访问权限声明
完全从应用程序中删除“所有文件访问”权限
对于针对Android 11的应用程序,requestLegacyExternalStorage标志将被忽略。必须使用“所有文件”访问权限才能保留广泛访问权限。
在未经允许的情况下请求访问所有文件访问权限的应用程序将从Google Play中删除,您将无法发布更新。
深入研究ReactNative CameraRoll软件包,它不仅仅是扫描文件,让操作系统显示在用户库应用程序中。
这里的解决方案是一些再聚焦:
- 不是:
storage/android/data/com.example/Pictures
- 在
或图片
或DCIM
(检查下载
)环境.目录\u DCIM
从“react native fs”导入RNFS
const{PNModule}=ReactNative.NativeModules
试一试{
如果(Platform.OS=='android'&&Platform.Version>=29){
//谷歌要求在针对android 11时不再使用requestLegacyExternalStorage,并使用
//作用域存储或新的全局权限,请参阅https://gitlab.inria.fr/floristic/pn-mobile-test/-/issues/417
//这里的解决方案是使用MediaStore API并将文件复制到DCIM文件夹的自定义模块。
const segments=path.split(“/”)
const fileName=segments[segments.length-1]
const fileUriPath=wait PNModule.moveToMediaStore(path.replace('file://',''),文件名)
如果(!fileUriPath){
返回空
}
const scanResult=await RNFS.scanFile(fileUriPath)
if(fileUriPath.startsWith('file://')){
返回文件路径
}
返回`file://${fileUriPath}`
}
返回等待CameraRoll.save(路径)
}捕获(错误){
控制台错误(错误)
}
本机软件包
(别忘了用你的应用文件夹替换APPNAME
)
@ReactMethod
public void moveToMediaStore(字符串文件路径、字符串文件名、承诺){
if(Build.VERSION.SDK_INT