การติดตั้งแสดงข้อผิดพลาดในคอนโซล: ผู้ให้บริการติดตั้งล้มเหลวความขัดแย้ง


165

ฉันกำลังทดลองกับโปรแกรมตัวอย่าง NotesList ใน Android SDK ฉันสร้างความแตกต่างเล็กน้อยในโปรแกรม แต่เมื่อฉันติดตั้งเวอร์ชันที่แก้ไขของฉันฉันจะได้รับข้อความต่อไป INSTALL_FAILED_CONFLICTING_PROVIDER ในคอนโซลเมื่อฉันพยายามติดตั้งเมื่อโปรแกรมบันทึกดั้งเดิมอยู่บนอุปกรณ์แล้ว ฉันต้องเปลี่ยนอะไรในผู้ให้บริการเพื่อให้เป็นฐานข้อมูลที่ไม่ซ้ำกัน มันทำงานได้ดีถ้าฉันถอนการติดตั้งโปรแกรมบันทึกดั้งเดิมแล้วติดตั้งรุ่นที่แก้ไข

คำตอบ:


198

ผู้มีอำนาจตามที่ระบุไว้ในandroid:authoritiesจะต้องไม่ซ้ำกัน การอ้างถึงเอกสารสำหรับคุณลักษณะนี้ :

เพื่อหลีกเลี่ยงความขัดแย้งชื่ออำนาจควรใช้หลักการตั้งชื่อแบบ Java (เช่น com.example.provider.cartoonprovider) โดยทั่วไปจะเป็นชื่อของคลาสย่อย ContentProvider ที่ใช้กับผู้ให้บริการ


5
@ CommonsWare ฉันได้ใช้android:authoritiesคุณสมบัติในAndroidManifest providerแท็กของฉัน ฉันใช้โครงการนี้เป็นโครงการห้องสมุด Android โดยใช้โครงการห้องสมุดนี้ฉันได้พัฒนาโครงการไม่กี่แห่ง วิธีแก้install_failed_conflicting_providerปัญหาถ้าเราใช้โครงการห้องสมุดทั่วไป
Jamal

1
@jamal: หากคุณใช้ Gradle สำหรับ Android เช่นจาก Android Studio ตัวเลือกการรวมที่ชัดแจ้งจะช่วยให้คุณสามารถปรับแต่งสิทธิในการใช้งาน มิฉะนั้นให้ลบรายการออก<provider>จากรายการของไลบรารีและกำหนดในระดับแอปพลิเคชันด้วยสตริงสิทธิ์เฉพาะ
CommonsWare

4
@jamal: tools.android.com/tech-docs/new-build-system/user-guide/ ...... - หากคุณมีคำถามเพิ่มเติมและคุณไม่สามารถหาคำตอบได้จากการค้นหาโปรดถามคำถาม Stack Overflow ใหม่
CommonsWare

11
หากคุณใช้ไลบรารีในสองโครงการที่มีชื่อผู้ให้บริการเดียวกันอาจทำให้เกิดข้อผิดพลาดนี้ได้
Mohammed Subhi Sheikh Quroush

1
ฉันไม่มีสิ่งดังกล่าวเหมือนandroid:authoritiesหรือ<provider>ในรายการห้องสมุดของฉันและได้รับข้อผิดพลาดนี้
lef

143

หากคุณมีรสชาติที่แตกต่างและคุณต้องการหลีกเลี่ยงการชนในชื่อหน่วยงานคุณสามารถเพิ่มapplicationIdSuffixประเภทการสร้างและใช้ผลลัพธ์applicationIdในรายการของคุณเช่นนี้:

<...
 android:authorities="${applicationId}.contentprovider"/>

คุณสามารถกำหนดของคุณเองapplicationIdในการกำหนดรสผลิตภัณฑ์แต่ละรายการ developer.android.com/studio/build/…
Jose L Ugia

ฉันคิดว่าถ้าคุณทำเช่นนี้มันจะแก้ไขรสชาติของผลิตภัณฑ์ที่แตกต่างกันตามที่คุณต้องสร้างความแตกต่างapplicationIdสำหรับแต่ละรสชาติอย่างไรก็ตาม หากคุณมี buildTypes ที่แตกต่างกันคุณต้องการapplicationIdสร้างความแตกต่างระหว่างสิ่งเหล่านั้นด้วยและนั่นคือสิ่งที่applicationIdSuffixสถานที่ให้บริการจะทำ
chubbsondubs

ขอบคุณการใช้ hardcoded android: เจ้าหน้าที่ใน fileprovider เป็นปัญหาของฉันอย่างแน่นอน!
บรูซ

คำตอบที่ดี! ก่อนเพิ่มและเรียกใช้ให้ล้างแอปพลิเคชันเวอร์ชันเก่าของคุณ
Eren Utku

30

หากคุณใช้ Google Maps + บริการ Google Play ภายในโครงการห้องสมุด (โดยเฉพาะเมื่อคุณเพิ่งย้ายจาก Eclipse ไปยัง Android Studio) คุณสามารถพบข้อผิดพลาดนี้เมื่อคุณพยายามเรียกใช้แอพที่ใช้ห้องสมุดของคุณในขณะที่แอพอื่นที่ใช้ มีไลบรารีเดียวกันติดตั้งอยู่ในอุปกรณ์ของคุณแล้ว

แก้ไข: ตรวจสอบให้แน่ใจว่า defaultConfig.applicationId มีการกำหนดไว้ในส่วน android ของbuild.gradleไฟล์สำหรับแต่ละโครงการโดยใช้ห้องสมุดของคุณ

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

ฉันอยากจะแนะนำให้ใช้ชื่อแพ็กเกจของแอพที่เฉพาะเจาะจง ด้วยการแก้ไขนี้ชื่อผู้ให้บริการจะไม่ขัดแย้งกันอีกต่อไปและแอปของคุณจะทำงานตามที่คาดไว้

อาการ

1. ) ผู้ใช้ของคุณเห็นข้อผิดพลาดในการติดตั้ง "-505" ที่น่ากลัวเมื่อติดตั้งแอพของคุณจาก Play Store

2. ) คุณจะเห็นข้อความแสดงข้อผิดพลาดนี้เมื่อคุณพยายามติดตั้งแอปที่สองที่ใช้ห้องสมุดของคุณผ่าน Android Studio [INSTALL_FAILED_CONFLICTING_PROVIDER]:

ผู้ให้บริการที่ขัดแย้งกัน

ในคอนโซลของคุณคุณจะเห็นข้อความดังนี้:

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

การแก้ไขคือเพื่อให้แน่ใจว่า defaultConfig.applicationId ถูกกำหนดไว้ในส่วน android ของbuild.gradleไฟล์สำหรับแต่ละโครงการโดยใช้ห้องสมุดของคุณ

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

อ่านเพิ่มเติมได้ที่นี่ในรายงานข้อผิดพลาดดั้งเดิม: ปัญหา 784: หลาย ๆ แอปโดยใช้ชื่อผู้ให้บริการสิทธิ์เดียวกัน


ฉันพบข้อผิดพลาดนี้หลังจาก "เพียงแค่" ย้ายโครงการของฉันจาก Eclipse ไปยัง Android Studio และเคล็ดลับนี้แก้ปัญหาได้ ขอบคุณ
Philippe Girolami

@PhippippiGirolami "เพียงแค่" แน่นอน เราใช้เวลาประมาณหนึ่งเดือนในการเปลี่ยนโครงการขนาดใหญ่มากจาก Eclipse เป็น Studio และตอนนี้เราถูกลงโทษด้วยเวลาสร้าง 4+ นาทีเทียบกับ 10-15 วินาทีใน Eclipse
DiscDev

@PhilippeGirolami android studio 2.0 นั้นถูกสร้างขึ้นเป็นพิเศษเพื่อจัดการกับความเชื่องช้า - พวกมันอยู่ในรุ่นเบต้า 5 อย่างไรก็ตามคุณต้องใช้ซอฟต์แวร์ beta studio ในความเสี่ยงของคุณเองบางครั้งมันก็ใช้งานได้ดีบางครั้งมันก็น่ากลัว
DiscDev

27

สิ่งนี้สามารถเกิดขึ้นได้เมื่อคุณติดตั้งแอปเวอร์ชันเก่าและทำการเปลี่ยนแปลงในไลบรารี (สนับสนุน) หรือไฟล์รายการ การลบแอปพลิเคชันเก่าจากอุปกรณ์ของคุณ ( Settings --> Application --> <your application> --> Uninstall) จะช่วยแก้ปัญหาได้


1
กันที่นี่ ฉันใช้อุปกรณ์เสมือนจริงของจีโนมและต้องลบแอปพลิเคชันที่ติดตั้งไว้ก่อนหน้านี้
ibaralf

23

หากคุณใช้ Facebook SDK ปัญหาอาจอยู่ในค่า "สิทธิ์" ที่คุณให้ไว้กับผู้ให้บริการ Facebook

แทนที่ -

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

ด้วย ->

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

คุณอาจต้องเปลี่ยนคำdefaultConfig.ApplicationIdแนะนำในคำตอบอื่น ๆ


upvoted ฉันขอแนะนำให้ใช้สิ่งนี้: android: ทางการ = "$ {applicationId} .com.facebook.FacebookContentProvider"
justinkoh

15

ข้อผิดพลาดเดียวกันอาจเกิดขึ้นหลังจากเปลี่ยนชื่อแพ็คเกจ ตรวจสอบค่าเป็น string.xml android:authoritiesจาก AndroidManifest.xml

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

ใน string.xml ค่าควรเป็นชื่อแพคเกจของคุณซึ่งประกาศไว้ในรายการ

<string name="content_authority">com.whatever.android.sunshine.app</string>

นี่เป็นโซลูชันที่ดี แต่ต้องใช้เวลา + พื้นที่ในการสร้างสตริงใหม่ในค่าสำหรับผู้ให้บริการแต่ละรายในแอปพลิเคชัน
lukassos


7

โดยพื้นฐานแล้วสิ่งนี้เกิดขึ้นกับฉันเมื่อฉันพยายามเปลี่ยนชื่อแพ็คเกจของแอพ

ดังนั้นในอีมูเลเตอร์จึงได้ติดตั้งแอพเดียวกันมาก่อน เมื่อฉันพยายามที่จะติดตั้งแอพหลังจากเปลี่ยนชื่อแพคเกจก็กล่าวว่าสิทธิ์ที่ใช้โดยแอปพลิเคชันเก่าในอุปกรณ์

หลังจากถอนการติดตั้งแอปพลิเคชันเพียงอย่างเดียวก็สามารถแก้ปัญหาของฉันได้

นอกจากนี้ชื่อหน่วยงานควรเป็น: your.package.name.UNIQUENAME;

ตัวอย่าง:

  <provider
        android:name="com.aviary.android.feather.cds.AviaryCdsProvider"
        android:authorities="your.package.name.AviaryCdsProvider"
       />

ฉันเพิ่ม 'tools: replace = "android: authority"' ไปยังผู้ให้บริการ
Christine

7

ฉันมีปัญหาที่คล้ายกันเมื่อฉันใช้ห้องสมุดหนึ่งในหลายแอปพลิเคชัน จำเป็นต้องอัปเดต AndroidManifest.xml ของคุณด้วยการประกาศผู้ให้บริการที่ถูกต้องด้านล่างนี้

<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> 

6

ฉันได้ลองวิธีแก้ปัญหามากมาย แต่ไม่สามารถหาวิธีแก้ปัญหา ... แต่ลิงค์นี้ช่วยฉัน ... ฉันต้องการให้รายละเอียดเกี่ยวกับปัญหา ...

ผมทำงานกรณีทดสอบ Instrumented เพื่อ app ของฉันไม่ได้มองเห็นในตัว ... แต่มันถูกติดตั้งและทำให้การใช้ผู้ให้บริการเนื้อหาเดียวกัน ดังนั้นฉันควรถอนการติดตั้งอย่างใด ดังนั้นSettings -> Application Manager -> All Downloaded Apps -> uninstall all apps from your current development package

ตอนนี้ลองเรียกใช้ ... มันจะทำงาน ...


6

ฉันคิดว่าการถอนการติดตั้งแอพด้วยการลากไอคอนไปที่ "ถอนการติดตั้ง" จะช่วยแก้ปัญหาได้ แต่ก็ไม่ได้

นี่คือสิ่งที่แก้ไขปัญหา:

  1. ไปที่การตั้งค่า
  2. เลือกแอพ
  3. ค้นหาแอปของคุณ (ใช่ฉันประหลาดใจที่ยังพบที่นี่!) และกด
  4. ที่ด้านบนขวากด 3 จุด
  5. เลือก " ถอนการติดตั้งสำหรับผู้ใช้ทั้งหมด "

ลองอีกครั้งมันควรจะใช้งานได้แล้ว


5

หากคุณใช้ Facebook ในแอพตรวจสอบว่ามีแท็กผู้ให้บริการอยู่ในAndroidManifestไฟล์ใดและตรวจสอบproject Idว่าถูกต้องหรือไม่android:authorities

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

4

พบปัญหานี้

แก้ไขโดย:

1 - เปิด AndroidManifest.xml

2 - ctrl + f ค้นหา "ผู้ให้บริการ"

3 - ค้นหาผู้ให้บริการและอัปเดตชื่อไดเรกทอรีรากของคุณที่นั่น

เรียกใช้โครงการ หวังว่าปัญหาจะได้รับการแก้ไข!


2

ติดตั้งโดยใช้ adb พร้อมกับคำสั่ง./adb install -r abc.apkจะแก้ปัญหาได้ (มันจะเขียนทับแม้ในขณะที่อุปกรณ์มีเวอร์ชันแอปที่สูงกว่า)


1

หากคุณอยู่ใน Xamarin และคุณได้รับข้อผิดพลาดนี้ (อาจเป็นเพราะ 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 [...]

ดังที่กล่าวไว้ที่นี่คุณต้องอัปเดต Xamarin.Build.Download:

  1. อัพเดท Xamarin.Build.Download Nuget Package เป็น0.4.12-preview3
    • บน Mac คุณอาจต้องตรวจสอบแสดงแพ็คเกจก่อนวางจำหน่ายในหน้าต่างเพิ่มแพ็คเกจ
  2. ปิด Visual Studio
  3. ลบตำแหน่งแคชทั้งหมดของแพ็คเกจ NuGet:
    • บน Windows ให้เปิด Visual Studio แต่ไม่สามารถแก้ปัญหาได้:
      • เครื่องมือ -> ตัวเลือก -> ผู้จัดการแพคเกจ Nuget -> ทั่วไป -> ล้างแคช Nuget ทั้งหมด
    • บน Mac ให้เช็ดโฟลเดอร์ต่อไปนี้:
      • ~/.local/share/NuGet
      • ~/.nuget/packages
      • packages โฟลเดอร์ในโซลูชัน
  4. ลบโฟลเดอร์ bin / obj ในโซลูชัน
  5. โหลดโซลูชัน
  6. คืนค่าแพคเกจ Nuget สำหรับโซลูชัน (ควรเรียกใช้โดยอัตโนมัติ)
  7. สร้างใหม่

0

ในอุปกรณ์ Android ของฉันฉันมีการติดตั้งแอพเดียวกันต่างกันรสชาติ นี้จะช่วยให้ฉันข้อผิดพลาดการติดตั้งล้มเหลวผู้ให้บริการที่ขัดแย้งกัน ดังนั้นฉันจึงถอนการติดตั้งแอพเดียวกันทุกรสชาติ และพยายาม

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

มันแก้ไขปัญหาของฉัน


0

คุณสามารถถอนการติดตั้งชื่อแพคเกจ "com.example" จากอุปกรณ์ที่คุณเรียกใช้แอพหลังจากที่คุณเรียกใช้แอพ สิ่งนี้ใช้ได้สำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.