Проблема с полномочиями поставщика дубликатов Android - PullRequest
7 голосов
/ 21 июня 2011

Мы пытаемся опубликовать бесплатную версию случайного приложения, которое в настоящее время публикуется бесплатно с рекламой.Мы переименовали все имена пакетов в com.mycompanyname.appname.pro, у бесплатного на рынке нет .pro в конце, по сути.Мы также вошли в наш контент-провайдер и изменили полномочия на те же, что и имя пакета.Таким образом, «бесплатная версия» имеет

AUTHORITY = "com.mycompanyname.appname" 

, а «платная версия без рекламы» имеет

AUTHORITY = "com.mycompanyname.appname.pro" 

, но мы все еще не можем установить как бесплатную, так и «профессиональную» версиюна одном и том же устройстве. Как бы то ни было, имя класса для провайдера одинаково в обоих приложениях.

Мы не можем установить с apk напрямую, и если мы пытаемся скачать с Android market, мы получаемсообщение об ошибке «полномочия дубликата провайдера».

Чего нам не хватает? Есть ли другое место, где нам нужно искать проблемы, или у нас здесь что-то принципиально неправильное?

Ответы [ 4 ]

2 голосов
/ 10 февраля 2016

Google по умолчанию добавляет провайдера измерения приложения в ваше приложение, поэтому в файле build.gradle вам нужно определить applicationID в теге android exaple defaultConfig {a pplicationId "com.example.my.app" minSdkVersion 15 targetSdkVersion19 versionCode 1 versionName "1.0"}

2 голосов
/ 19 октября 2012

По сути, я создал абстрактный базовый класс для каждого из моих ContentProviders и унаследовал его от каждого приложения, которое я хочу создать, переопределив путь полномочий. Итак, в моем AbstractContentProvider у меня есть:

public AbstractContentProvider() {
    sURIMatcher.addURI(getAuthority(), BASE_PATH, ITEMS);
    sURIMatcher.addURI(getAuthority(), BASE_PATH + "/#", ITEM_ID);
}

protected abstract String getAuthority();

и затем в каждом подклассе у меня есть:

private static final String AUTHORITY = "my.package.app1.ContentProvider";

@Override
protected String getAuthority() {
    return AUTHORITY;
}

В AndroidManifest я регистрирую их с помощью:

    <provider
          android:name="my.package.app1.ContentProvider"
          android:authorities="my.package.app1.ContentProvider">
    </provider>

Теперь дело в том, что я хочу получить доступ к этим поставщикам контента в общем (библиотечном) коде, который не знает о конкретных классах приложения. Для этого я определяю строку в своем strings.xml, которую переопределяю для каждого приложения. Тогда я могу использовать:

Uri.parse(getString(R.string.contentProviderUri))

и в каждом приложении правильный ContentProvider используется без каких-либо конфликтов. Таким образом, в основном используется механизм конфигурации для внедрения зависимостей.

2 голосов
/ 11 января 2014

Допустим, ваш библиотечный пакет com.android.app.library бесплатный пакет com.android.app.free платный пакет com.android.app.paid

В вашем бесплатном и платном проекте создайте в пакете одинаковый файл, который может быть любым,но должно быть одинаковым.

Пример:

  1. Создать новый пакет в бесплатной версии с com.android.app.data

  2. Создайте файл с именем Authority.java и внутри (Authority.java) поместите:

    public class Authority {

    `public static final String CONTENT_AUTHORITY = "YOUR PROVIDER";`
    

    }

  3. Повторите это для платной версии, не забудьте сохранить имя пакета и имя класса.

Теперь, в вашем контрактном файле, в вашей библиотеке используйте следующее:

public static String AUTHORITY = initAuthority();

    private static String initAuthority() {
        String authority = "something.went.wrong.if.this.is.used";

        try {

            ClassLoader loader = Contract.class.getClassLoader();

            Class<?> clz = loader.loadClass("com.android.app.data.Authority");
            Field declaredField = clz.getDeclaredField("CONTENT_AUTHORITY");

            authority = declaredField.get(null).toString();
        } catch (ClassNotFoundException e) {} 
        catch (NoSuchFieldException e) {} 
        catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }

        return authority;
    }

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

Теперь вы сможете использовать два авторитета.

Кредит: Иан Уорик Android - Наличие полномочий провайдера в проекте приложения

0 голосов
/ 30 марта 2012

Я столкнулся с той же проблемой, с сообщением об ошибке с жалобой на то, что имя провайдера уже зарегистрировано.Я подумал, что хитрость может заключаться в том, чтобы использовать как разные полномочия, так и другое имя, поэтому, в моем случае, расширение моего базового провайдера из проекта библиотеки в бесплатной и профессиональной версиях.Это исправит вашу проблему, если она у вас все еще есть (заметили, что это было старое сообщение, но ответов нет, поэтому я все равно решил опубликовать способ, которым обошел его).сталкивался с тем же, и, безусловно, это ошибка в платформе Android.См. Подробности вопроса здесь или аналогичные сообщения SO здесь .

...