程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了跨应用的 Android 共享存储大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_673_0@如何解决跨应用的 Android 共享存储? 开发过程中遇到跨应用的 Android 共享存储的问题如何解决?下面主要结合日常开发的经验,给出你关于跨应用的 Android 共享存储的解决方法建议,希望对你解决跨应用的 Android 共享存储有所启发或帮助;

我正在努力寻找在用户设备上的多个应用之间共享数据的最佳解决方案。所有这些 androID 应用程序都将使用相同的签名。由于用户体验很重要,因此无法提示共享或授予数据权限(因此不虑共享意图)

我尝试了以下解决方案,结果如下;

  • SharedPreferences with sharedUserID 不是一个选项,因为这些是现有的应用程序,它们已经具有默认的 sharedUserID 值,这将阻止用户升级
  • ContentProvIDer 使用 sqlite 是有希望的,但是由于任何应用程序都可以共享数据并且不知道将首先安装或安装哪个应用程序,因此无法确定哪个应用程序应该具有 { {1}}。除非有一种方法可以创建任何应用程序都可以初始化的内容提供程序,如果它是第一个应用程序,那么我不确定如何继续使用此解决方案
  • 我目前正在尝试使用外部存储并简单地存储一个包含需要共享的数据的文件。这显然是最脆弱的解决方案,但我可能只存储临时敏感数据(几分钟后过期的令牌)。但仍在寻找最佳解决方案。

任何专业知识或见解都会有所帮助。

@H_673_0@解决方法

谢谢@morrison-chang 和@blackapps。使用您评论中的要点,我找到了一个有效的解决方案。我对每个应用程序上的同一个提供商都有独特的权限。但是,默认情况下它们都是禁用的。每当任何应用程序需要访问其提供程序时,它都会检查是否有可用的现有应用程序。

someClassUsingMyContextProvider.java

...
private Uri getActiveSharedStorageContentUri(){
    List<PackageInfo> packs = packageManager.geTinstalledPackages(PackageManager.GET_PROVIDERS);
    for (PackageInfo pack : packs) {
        ProviderInfo[] providers = pack.providers;
        if (providers != null) {
            for (ProviderInfo provider : providers) {
                if(provider != null && provider.authority != null && provider.authority.endsWith(SharedStorageProvider.AUTHORITY_SUFFIX)){
                    return SharedStorageProvider.createContentUri(provider.authority);
                }
            }
        }
    }

    // If no valid provider.authority was found for SharedStorageProvider then we can assume
    // that the current app's SharedStorageProvider provider has not been enabled yet.
    // Lets activate it and then use its CONTENT_URI
    ComponentName componentName = new ComponentName(reactContext,SharedStorageProvider.class);
    packageManager.setComponentEnabledSetTing(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APp);
    return SharedStorageProvider.CONTENT_URI;
}
...

SharedStorageProvider.java

public class SharedStorageProvider extends ContentProvider {
    public static final String AUTHORITY_SUFFIX = String.format(".SharedStorageProvider.%s",BuildConfig.APP_GROUp);
    public static final String AUTHORITY = String.format("%s%s",BuildConfig.APPLICATION_ID,AUTHORITY_SUFFIX);
    ...
    public static final Uri CONTENT_URI = createContentUri(AUTHORITY);
    ...
    public static Uri createContentUri(String authority) {
        return Uri.parse("content://" + authority + "/" + BASE_PATH);
    }
    ...

AndroidManifest.xml

...
<uses-permission android:name="com.myapps.READ_DATABASE" />
<uses-permission android:name="com.myapps.WRITE_DATABASE" />
<permission android:name="com.myapps.READ_DATABASE" android:protectionLevel="signature" />
<permission android:name="com.myapps.WRITE_DATABASE" android:protectionLevel="signature" />
...
<application
    ...
    <provider
        android:name=".SharedStorageProvider"
        android:authorities="@String/shared_storage_provider_authority"
        android:exported="true"
        android:enabled="false"
        android:readPermission="com.myapps.READ_DATABASE"
        android:writePermission="com.myapps.WRITE_DATABASE"
    />
</application>
...

build.gradle

...
resValue "String","shared_storage_provider_authority",applicationId + ".SharedStorageProvider." + project.env.get("APP_GROUP") // Used to generate dynamic authority name
...

已知限制; 由于这仅将来自启用它的应用程序的数据存储在内容提供程序中,如果该应用程序被卸载,那么“共享”数据将从所有使用它的应用程序中丢失。对我来说,这很好。

大佬总结

以上是大佬教程为你收集整理的跨应用的 Android 共享存储全部内容,希望文章能够帮你解决跨应用的 Android 共享存储所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。