有几个应用程序管理一个内容提供商 - INSTALL_FAILED_CONFLICTING_PROVIDER

时间:2017-03-07 18:44:03

标签: android android-contentprovider

我需要使用相同内容提供商的多个应用。用户安装的第一个应用程序创建提供程序并添加UUID,每个其他应用程序在安装时检查此提供程序是否已存在并使用该UUID,或者,如果之前未安装其他应用程序,则会创建内容提供程序其他应用程序使用的UUID。

我如何实现这一目标,让多个应用程序管理同一个内容提供商,而不会产生以下错误,从而产生具有相同权限的问题。

INSTALL_FAILED_CONFLICTING_PROVIDER

我可以以某种方式更改提供程序权限并让它访问相同的内容提供程序吗?如果我更改权限并使用相同的URL,它会告诉我它无效。

谢谢!

2 个答案:

答案 0 :(得分:1)

这可能不是最好的方法。提供商ID在系统范围内是唯一的,您在给定时间实际上不能有多个。但是如果你想坚持下去,你可以阅读更多相关信息herehere

您需要从应用访问数据吗?最好使用Intents或其他策略作为文件或在线数据库。

您可以查看Realm来帮助您解决问题。

答案 1 :(得分:0)

我设法通过创建this post中的唯一标识符并使​​用Android手机版本不同的Android ID来设置不同的方法,我可以拥有一个独特的,不可更改的ID,因此任何应用只需加载此ID。

这是我使用的代码:

/**
     * Return pseudo unique ID
     * @return ID
     */
    public static String getUniquePsuedoID(Context context) {
        // If all else fails, if the user does have lower than API 9 (lower
        // than Gingerbread), has reset their device or 'Secure.ANDROID_ID'
        // returns 'null', then simply the ID returned will be solely based
        // off their Android device information. This is where the collisions
        // can happen.
        // Thanks http://www.pocketmagic.net/?p=1662!
        // Try not to use DISPLAY, HOST or ID - these items could change.
        // If there are collisions, there will be overlapping data
        String android_id = Settings.Secure.getString(context.getContentResolver(),
                Settings.Secure.ANDROID_ID);
        String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + android_id + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

        // Thanks to @Roman SL!
        // https://stackoverflow.com/a/4789483/950427
        // Only devices with API >= 9 have android.os.Build.SERIAL
        // http://developer.android.com/reference/android/os/Build.html#SERIAL
        // If a user upgrades software or roots their device, there will be a duplicate entry
        String serial = null;
        try {
            serial = android.os.Build.class.getField("SERIAL").get(null).toString();

            // Go ahead and return the serial for api => 9
            return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
        } catch (Exception exception) {
            // String needs to be initialized
            serial = "serial"; // some value
        }

        // Thanks @Joe!
        // https://stackoverflow.com/a/2853253/950427
        // Finally, combine the values we have found by using the UUID class to create a unique identifier
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }