2011-06-21 10 views
6

हम एक आकस्मिक ऐप का भुगतान विज्ञापन मुक्त संस्करण प्रकाशित करने का प्रयास कर रहे हैं जो वर्तमान में विज्ञापनों के साथ निःशुल्क प्रकाशित हुआ है। हमने सभी पैकेज नामों को com.mycompanyname.appname.pro पर दोबारा प्रतिक्रिया दी, बाजार में मुफ़्त में मूल रूप से .pro नहीं है। हम भी हमारे सामग्री प्रदाता में गए और प्राधिकरण को पैकेज नाम के समान बदल दिया। तो "नि: शुल्क संस्करण"एंड्रॉइड डुप्लिकेट प्रदाता प्राधिकरण समस्या

AUTHORITY = "com.mycompanyname.appname" 

है और "विज्ञापन मुक्त भुगतान संस्करण

AUTHORITY = "com.mycompanyname.appname.pro" 

है, लेकिन अभी भी हम दोनों स्वतंत्र और स्थापित करने में असमर्थ रहे हैं" एक ही डिवाइस पर समर्थक "संस्करण जो भी इसके लायक है, प्रदाता के लिए वर्ग का नाम दोनों ऐप्स में समान है।

हम सीधे एपीके से इंस्टॉल नहीं कर सकते हैं, और अगर हम एंड्रॉइड मार्केट से डाउनलोड करने का प्रयास करते हैं तो हमें "डुप्लिकेट प्रदाता प्राधिकरण" मिलता है। त्रुटि संदेश

हम क्या खो रहे हैं? क्या कोई और जगह है जहां हमें समस्याओं की तलाश करने की ज़रूरत है, या क्या हमें यहां मौलिक रूप से गलत कुछ मिला है?

उत्तर

0

मैं एक ही समस्या में चल रहा था, एक त्रुटि संदेश शिकायत कर रहा था कि प्रदाता नाम पहले ही पंजीकृत था। मैंने सोचा कि यह चाल एक अलग प्राधिकारी के साथ-साथ एक अलग नाम दोनों का उपयोग करने के लिए हो सकती है - इसलिए, मेरे मामले में लाइब्रेरी प्रोजेक्ट से लाइब्रेरी प्रोजेक्ट में मेरे बेस प्रदाता को विस्तारित करना। यह आपकी समस्या को ठीक करेगा, अगर आप अभी भी इसे देख रहे हैं (ध्यान दिया कि यह एक पुरानी पोस्ट थी, लेकिन कोई जवाब नहीं था इसलिए मैंने जिस तरह से इसे चारों ओर प्राप्त किया, उसे पोस्ट करने का फैसला किया)।

मैं उत्सुक था कि अगर कोई और एक ही चीज़ में चल रहा था, और यह सुनिश्चित है कि यह एंड्रॉइड मंच में एक बग प्रतीत होता है। समस्या विवरण here या एक समान SO पोस्ट here देखें।

2

असल में मैंने जो किया है, मेरे प्रत्येक सामग्री प्रदाता के लिए एक सार आधार वर्ग बनाएं और प्रत्येक ऐप के लिए उस से प्राप्त करें, जिसे मैं प्राधिकरण पथ को ओवरराइड करना चाहता हूं। तो मेरी 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> 

अब चाल है, मैं इन सामग्री प्रदाताओं को सामान्य (लाइब्रेरी) कोड में एक्सेस करना चाहते हैं, जो ऐप विशिष्ट कक्षाओं के बारे में नहीं जानते हैं। ऐसा करने के लिए, मैं अपने स्ट्रिंग्स.एक्सएमएल में एक स्ट्रिंग को परिभाषित करता हूं, कि मैं प्रत्येक ऐप के लिए ओवरराइड करता हूं। फिर मैं इसका उपयोग कर सकता हूं:

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

और प्रत्येक ऐप में सही सामग्री प्रदाता किसी भी विवाद के बिना उपयोग किया जाता है। तो मूल रूप से निर्भरता इंजेक्शन के लिए विन्यास तंत्र का उपयोग कर।

2

चलें मान लें कि आपका पुस्तकालय पैकेज 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); 

अब आपके पास दो अधिकारियों उपयोग करने के लिए सक्षम होना चाहिए।

क्रेडिट: इयान Warick Android - Having Provider authority in the app project

+0

@ Jerryl15 मैं सैम था ई समस्या जो प्राधिकरणों को मुझे प्रकट में घोषित करना चाहिए कि "com.android.app.data.Authority" या प्राधिकरण = "something.went.wrong.if.this.is.used" – Manoj

2

Google डिफ़ॉल्ट रूप से आपके एप्लिकेशन में एप्लिकेशन के आकलन प्रदाता जोड़ने build.gradle फ़ाइल में तो तुम exaple defaultConfig { एक pplicationId "com.example एंड्रॉयड टैग के तहत applicationID परिभाषित करने की जरूरत .my.app " minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName" 1.0 " }

+0

यह मेरी समस्या का समाधान करता है। +1 – Smeet

+0

इसने मेरे मुद्दे को भी हल किया। Google Play Store पर हमारे ऐप इंस्टॉल करते समय लोगों को 505 त्रुटि हो रही थी – Jeenyus

संबंधित मुद्दे