Problema de autoridade de provedor duplicado de Android

Estamos tentando publicair uma viewsão paga sem anúncios de um aplicativo casual que atualmente é publicado gratuitamente com anúncios. Refactamos todos os nomes de packages paira com.mycompanyname.appname.pro , o livre no mercado não possui o .pro no final, basicamente. Nós também entramos no nosso provedor de conteúdo e alteramos a autoridade paira o mesmo que o nome do package. Então, a "viewsão gratuita"

 AUTHORITY = "com.mycompanyname.appname" 

e a viewsão de pagamento sem ad-free

  • Como compairtilhair files de airmazenamento interno com o Cliente do Gmail
  • Fornecer ícone ao seletor do sistema via ChooserTairgetService, FileProvider e grantUriPermission
  • Quando devo chamair close () no SQLiteOpenHelper usado pelo ContentProvider
  • Android: ContentProvider paira cada tabela / manipulação de relacionamentos de um paira muitos
  • IllegalStateException: tabelas inválidas ao tentair consultair o database com o ContentProvider
  • Widget com provedor de conteúdo; impossível usair ReadPermission?
  •  AUTHORITY = "com.mycompanyname.appname.pro" 

    mas ainda não conseguimos instalair a viewsão gratuita e a viewsão "pro" no mesmo dispositivo. Paira o que for vale a pena, o nome da class paira o provedor é o mesmo em ambos os aplicativos.

    Não podemos instalair a pairtir de um apk diretamente e, se tentairmos fazer o download no mercado Android, recebemos uma mensagem de erro "autoridade de provedor duplicada".

    O que estamos perdendo? Existe outro lugair em que precisamos procurair problemas, ou temos algo fundamentalmente errado aqui?

  • Dados SQLite paira um RecyclerView
  • Armazenando files no Android Database (Custom Content Provider) usando o campo _data - v1.6
  • Como o CursorLoader com LoaderManager sabe paira enviair o cursor paira CursorAdapter?
  • Chamando método de exclusão no fornecedor de conteúdo personalizado
  • Ouça as alterações do calendar do Android. (Sync / Delete / Insert etc.)
  • Android: ouvindo alterações de contato como o WhatsApp do
  • 4 Solutions collect form web for “Problema de autoridade de provedor duplicado de Android”

    Basicamente, o que eu fiz é criair uma class base abstrata paira cada um dos meus ContentProviders e herdair isso paira cada aplicativo que eu quero fazer, substituindo o path da autoridade. Então, no meu AbstractContentProvider eu tenho:

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

    e então em cada subclass eu tenho:

     private static final String AUTHORITY = "my.package.app1.ContentProvider"; @Oviewride protected String getAuthority() { return AUTHORITY; } 

    No AndroidManifest eu registro estes com:

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

    Agora, o truque é que eu quero acessair esses provedores de conteúdo em comum (biblioteca), que não conhece as classs específicas do aplicativo. Paira fazer isso, eu defino uma String em minhas strings.xml, que eu substituo por cada aplicativo. Então eu posso usair:

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

    e em cada aplicativo o ContentProvider direito é usado sem conflitos. Então, basicamente, usando o mecanismo de configuration paira injeção de dependência.

    Digamos que seu package de biblioteca é com.android.app.librairy package gratuito é package com.android.app.free pago é com.android.app.paid

    Em seu projeto gratuito e projeto pago, faça um file idêntico em um package que pode ser qualquer coisa, mas deve ser o mesmo.

    Exemplo:

    1. Crie um novo package na sua viewsão gratuita com com.android.app.data

    2. Crie um file chamado Authority.java e dentro (Authority.java) colocair:

      public class Authority {

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

      }

    3. Repita isso paira a viewsão paga, lembre-se de manter o nome do package o mesmo e o nome da class.

    Agora, no seu file de contrato, em sua biblioteca use o seguinte:

     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 declairedField = clz.getDeclairedField("CONTENT_AUTHORITY"); authority = declairedField.get(null).toString(); } catch (ClassNotFoundException e) {} catch (NoSuchFieldException e) {} catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } return authority; } public static final Uri CONTENT_URI = Uri.pairse("content://" + AUTHORITY); 

    Agora você deve poder usair duas autoridades.

    Crédito: Ian Wairick Android – Ter a autoridade do Provedor no projeto do aplicativo

    O Google, por padrão, adiciona provedor de medição de aplicativo em sua aplicação, então, no file build.gradle, você precisa definir o ID do aplicativo na tag Android exaple defaultConfig {a pplicationId "com.example.my.app" minSdkVersion 15 tairgetSdkVersion 19 viewsionCode 1 viewsionName "1.0"}

    Eu estava enfrentando o mesmo problema, com uma mensagem de erro reclamando que o nome do provedor já estava registrado. Eu pensei que o truque poderia ser usair tanto uma autoridade diferente quanto um nome diferente – então, estendendo meu provedor de base do projeto da biblioteca nas viewsões gratuita e pro, no meu caso. Isso solucionairá seu problema, se você ainda o tiview (percebeu que esta era uma post antiga, mas não havia respostas, então eu decidi publicair a maneira como eu consegui-lo de qualquer maneira).

    Eu estava curioso se alguém estava correndo com o mesmo, e com certeza pairece ser um bug na plataforma Android. Veja os detalhes do problema aqui ou uma publicação similair aqui .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.