Instalator pokazuje błąd w konsoli: INSTALACJA NIE POWIODŁA SIĘ DOSTAWCY KONFLIKTUJĄCEGO

165

Eksperymentuję z przykładowym programem NotesList w Android SDK. Zrobiłem niewielką zmianę w programie, ale kiedy instaluję edytowaną wersję, w konsoli pojawia się komunikat INSTALL_FAILED_CONFLICTING_PROVIDER, gdy próbuję go zainstalować, gdy oryginalny program do notatek jest już na urządzeniu. Co muszę zmienić w Dostawcy, aby był to unikatowa baza danych? Działa dobrze, jeśli odinstaluję oryginalny program do notatek, a następnie zainstaluję zmodyfikowaną wersję.

johnsonjp34
źródło

Odpowiedzi:

198

Uprawnienie wymienione w android:authoritiesmusi być unikalne. Cytując dokumentację dla tego atrybutu :

Aby uniknąć konfliktów, nazwy uprawnień powinny być zgodne z konwencją nazewnictwa w stylu Java (na przykład com.example.provider.cartoonprovider). Zazwyczaj jest to nazwa podklasy ContentProvider, która implementuje dostawcę

CommonsWare
źródło
5
@ CommonsWare Użyłem android:authoritiesatrybutu w moim AndroidManifest providertagu. Użyłem tego projektu jako mojego projektu biblioteki dla systemu Android. Korzystając z tego projektu biblioteki, opracowałem kilka projektów. jak rozwiązać install_failed_conflicting_providerproblem, jeśli użyliśmy wspólnego projektu bibliotecznego.
Jamal
1
@jamal: Jeśli używasz Gradle na Androida, na przykład z Android Studio, opcje scalania manifestu pozwolą Ci dostosować ciąg autoryzacji. W przeciwnym razie usuń <provider>plik z manifestu biblioteki i zdefiniuj go na poziomie aplikacji za pomocą unikatowego łańcucha uprawnień.
CommonsWare
4
@jamal: tools.android.com/tech-docs/new-build-system/user-guide/… - jeśli masz dalsze pytania i nie możesz znaleźć odpowiedzi za pomocą wyszukiwania, zadaj nowe pytanie dotyczące przepełnienia stosu.
CommonsWare
11
jeśli używasz biblioteki w dwóch projektach o tej samej nazwie dostawcy, może to spowodować ten błąd
Mohammed Subhi Sheikh Quroush
1
Nie mam czegoś takiego jak android:authoritieslub <provider>w moim manifeście biblioteki i otrzymuję ten błąd.
LEF
143

Jeśli masz różne smaki i chcesz uniknąć kolizji w nazwie urzędu, możesz dodać applicationIdSuffixdo typów kompilacji i użyć wynikowego applicationIdw swoim manifeście, na przykład:

<...
 android:authorities="${applicationId}.contentprovider"/>
Jose L Ugia
źródło
Możesz zdefiniować własną applicationIddefinicję smaku dla każdego produktu. developer.android.com/studio/build/…
Jose L Ugia
Myślę, że jeśli to zrobisz, naprawi to różne smaki produktu, ponieważ i tak musisz stworzyć inny applicationIdsmak dla każdego smaku. Jeśli masz różne typy buildTypów, chcesz applicationIdsię również różnić między nimi i to właśnie applicationIdSuffixzrobi ta właściwość.
chubbsondubs
Dzięki, używając zakodowanego na stałe Androida: autorytety w dostawcy plików to dokładnie mój problem!
Bruce
Świetna odpowiedź! Przed ich dodaniem i uruchomieniem wyczyść starą wersję aplikacji.
Eren Utku
30

Jeśli korzystasz z Google Maps + Google Play Services w projekcie biblioteki (zwłaszcza jeśli niedawno przeprowadziłeś migrację z Eclipse do Android Studio), możesz napotkać ten błąd podczas próby uruchomienia aplikacji korzystającej z biblioteki, podczas gdy inna aplikacja używa ta sama biblioteka jest już zainstalowana na Twoim urządzeniu.

Poprawka: upewnij się, że defaultConfig.applicationId jest zdefiniowany w sekcji Android build.gradlepliku dla każdego projektu korzystającego z biblioteki

android {
    defaultConfig.applicationId = "com.company.appname"
}

Polecam użycie nazwy pakietu konkretnej aplikacji. Dzięki tej poprawce nazwy dostawców nie będą już powodować konfliktów, a aplikacja będzie działać zgodnie z oczekiwaniami.

Objawy

1.) Twoi użytkownicy widzą przerażający błąd instalacji „-505” podczas instalowania aplikacji ze Sklepu Play.

2.) Podczas próby zainstalowania drugiej aplikacji korzystającej z biblioteki za pośrednictwem Android Studio zobaczysz ten komunikat o błędzie [INSTALL_FAILED_CONFLICTING_PROVIDER]:

Dostawca będący w konflikcie

W konsoli zobaczysz następujący komunikat:

Package couldn't be installed in /data/app/com.company.appname-1
com.android.server.pm.PackageManagerException: 
Can't install because provider name 
com.google.android.gms.measurement.google_measurement_service 
(in package com.company.appname) is already used by
com.company.otherInstalledAppName

Poprawka polega na tym, aby upewnić się, że defaultConfig.applicationId jest zdefiniowany w sekcji android build.gradlepliku dla każdego projektu korzystającego z biblioteki

android {
    defaultConfig.applicationId = "com.company.appname"
}

Więcej informacji można znaleźć w oryginalnym raporcie o błędzie: Problem 784: Wiele aplikacji używających tej samej nazwy dostawcy uprawnień

DiscDev
źródło
Napotkałem ten błąd po „prostym” przeniesieniu moich projektów z Eclipse do Android Studio i ta wskazówka rozwiązała problem. Dzięki
Philippe Girolami
@PhilippeGirolami „po prostu” na pewno. Pełne przeniesienie bardzo dużego projektu z Eclipse do Studio zajęło nam około miesiąca, a teraz jesteśmy karani ponad 4-minutowym czasem budowy, w porównaniu z 10-15 sekundami w Eclipse.
DiscDev
@PhilippeGirolami Android Studio 2.0 jest tworzone specjalnie z myślą o rozwiązaniu problemu powolnego działania - są w wersji beta 5. Jednak używaj oprogramowania studia beta na własne ryzyko, czasami działa świetnie, czasami jest okropne i zrujnuje ci noc.
DiscDev
27

Może się to również zdarzyć, gdy masz zainstalowaną starszą wersję aplikacji i wprowadziłeś zmiany w (pomocniczej) bibliotece lub pliku manifestu. Usunięcie starych aplikacji z urządzenia ( Settings --> Application --> <your application> --> Uninstall) rozwiąże wtedy problem.

nburk
źródło
1
To samo tutaj. Korzystałem z urządzeń wirtualnych genymotion i musiałem usunąć wcześniej zainstalowaną aplikację.
ibaralf
23

Jeśli korzystasz z Facebook SDK, problem może dotyczyć wartości „władz”, które podajesz dostawcy Facebooka.

ZASTĄPIĆ -

<provider
        android:name="com.facebook.FacebookContentProvider"
        android:authorities="com.facebook.FacebookContentProvider"
        android:exported="true" />

Z ->

<provider
        android:name="com.facebook.FacebookContentProvider"
        android:authorities="com.facebook.FacebookContentProvider[YOUR_APP_ID]"
        android:exported="true" />

Być może będziesz musiał zmienić defaultConfig.ApplicationIdrównież, jak sugerowano w innych odpowiedziach.

Ankit Aggarwal
źródło
upvoted, proponuję użyć to: Android: Władze = "$ {applicationId} .com.facebook.FacebookContentProvider"
justinkoh
15

Ten sam błąd może wystąpić po zmianie nazwy pakietów. Sprawdź wartość w string.xml dla android:authoritiesz AndroidManifest.xml.

<provider
        android:authorities="@string/content_authority"
        android:name=".data.Provider"
        ... />

W string.xml wartość powinna być taka sama jak nazwa twojego pakietu, zadeklarowana w manifeście.

<string name="content_authority">com.whatever.android.sunshine.app</string>
burseaner
źródło
Jest to również dobre rozwiązanie, ale utworzenie nowego ciągu w wartościach dla każdego dostawcy w aplikacji wymaga czasu i miejsca.
lukassos
8

Prawdopodobnie nazwa organu i dostawcy, którą zadeklarowałeś w manifeście

Benoit
źródło
7

Zasadniczo stało się to ze mną, kiedy próbowałem zmienić nazwę pakietu aplikacji.

Tak więc w emulatorze ta sama aplikacja została zainstalowana wcześniej. Kiedy próbowałem zainstalować aplikację po zmianie nazwy pakietu, powiedziałem, że uprawnienia są już używane przez starszą aplikację w urządzeniu.

Po odinstalowaniu aplikacji rozwiązało to mój problem.

Ponadto nazwa organu powinna zawsze wyglądać następująco your.package.name.UNIQUENAME:;

przykład:

  <provider
        android:name="com.aviary.android.feather.cds.AviaryCdsProvider"
        android:authorities="your.package.name.AviaryCdsProvider"
       />
Ajay P. Prajapati
źródło
Dodałem do dostawcy 'tools: replace = "android: authority"'.
Christine
7

Miałem podobny problem, gdy korzystałem z jednej biblioteki w kilku aplikacjach. Konieczne było po prostu zaktualizowanie pliku AndroidManifest.xml za pomocą tej dokładnej deklaracji dostawcy poniżej.

<manifest ...>
    <application ...>
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.here.this.library.provider" android:exported="false" android:grantUriPermissions="true" tools:replace="android:authorities">
        </provider>
    </application>  
</manifest> 
Vladyslav Panchenko
źródło
6

Próbowałem wielu rozwiązań, ale nie mogłem znaleźć rozwiązania ... ale ten link pomógł mi ... Chcę szczegółowo opisać problem ...

Uruchomiłem instrumentalne przypadki testowe, więc moja aplikacja nie była widoczna w programie uruchamiającym ... ale została zainstalowana i korzystała z tego samego dostawcy treści . Więc powinienem to jakoś odinstalować. WięcSettings -> Application Manager -> All Downloaded Apps -> uninstall all apps from your current development package

Teraz spróbuj uruchomić ... To zadziała ...

Kushal
źródło
6

Myślałem, że odinstalowanie aplikacji poprzez przeciągnięcie jej ikony na „Odinstaluj” rozwiązałoby problem, ale tak się nie stało.

Oto, co rozwiązało problem:

  1. Przejdź do ustawień
  2. Wybierz aplikacje
  3. Znajdź swoją aplikację (tak, byłem zaskoczony, że nadal ją tutaj znajduję!) I naciśnij
  4. W prawym górnym rogu naciśnij 3 kropki
  5. Wybierz „ Odinstaluj dla wszystkich użytkowników

Spróbuj ponownie, powinno teraz działać.

Nicolas Raoul
źródło
5

Jeśli korzystasz z aplikacji Facebook Inside, sprawdź tag dostawcy w AndroidManifestpliku i sprawdź, czy project Idjest poprawnyandroid:authorities

<provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider112623702612345" android:exported="true" />
Dattatray Nande
źródło
4

Napotkałem ten problem.

Rozwiązano to przez:

1 - otwórz AndroidManifest.xml

2 - ctrl + f znajdź „dostawca”

3 - znajdź dostawcę i zaktualizuj tam nazwę swojego katalogu głównego.

uruchom projekt. miejmy nadzieję, że problem zostanie rozwiązany!

Ali Nawaz
źródło
2

instalacja za pomocą adb z poleceniem ./adb install -r abc.apkrozwiąże problem (nadpisze nawet, gdy urządzenie ma wyższą wersję aplikacji)

Quang Vĩnh Ha
źródło
1

Jeśli korzystasz z platformy Xamarin i otrzymujesz ten błąd (prawdopodobnie z powodu Firebase.Crashlytics):

INSTALL_FAILED_CONFLICTING_PROVIDER
Package couldn't be installed in [...]
Can't install because provider name dollar_openBracket_applicationId_closeBracket (in package [...]]) is already used by [...]

Jak wspomniano tutaj , musisz zaktualizować Xamarin.Build.Download:

  1. Zaktualizuj pakiet Xamarin.Build.Download Nuget do wersji 0.4.12-preview3
    • Na Mac, może trzeba sprawdzić Pokaż pakietów pre uwalnianiu w Dodaje pakiety oknie
  2. Zamknij program Visual Studio
  3. Usuń wszystkie buforowane lokalizacje pakietów NuGet:
    • W systemie Windows otwórz program Visual Studio, ale nie rozwiązanie:
      • Narzędzia -> Opcja -> Menedżer pakietów Nuget -> Ogólne -> Wyczyść wszystkie pamięci podręczne Nuget
    • Na komputerze Mac wyczyść następujące foldery:
      • ~/.local/share/NuGet
      • ~/.nuget/packages
      • packages folder w roztworze
  4. Usuń foldery bin / obj w rozwiązaniu
  5. Załaduj rozwiązanie
  6. Przywróć pakiety Nuget dla rozwiązania (powinno działać automatycznie)
  7. Odbudować
gianlucaparadise
źródło
0

Na moim urządzeniu z Androidem miałem różne smaki instalacji tej samej aplikacji . To daje mi błąd INSTALACJA NIEUDANA KOLIZUJĄCEGO DOSTAWCĘ . więc odinstalowałem wszystkie moje smaki tej samej aplikacji. i próbowałem

adb install -r /Users/demo-debug-92acfc5.apk

To rozwiązało mój problem.

Vrushali Raut
źródło
0

Możesz odinstalować nazwę pakietu „com.example” z urządzenia, na którym uruchomisz aplikację po jej uruchomieniu. To zadziałało dla mnie

MEGHA DOBARIYA
źródło