2012-08-31 19 views
7

तक पहुंच प्रतिबंधित करें मुझे एक पोस्ट नहीं मिला जो मेरे जैसा ही प्रतिबंध मांगता है।सामग्री प्रदाता

मेरे पास एक ऐसा एप्लिकेशन है जो एक सामग्री प्रदाता (इसे मुख्य एप्लिकेशन कहते हैं) प्रदान करता है अन्य अनुप्रयोगों (उन्हें क्लाइंट एप्लिकेशन कॉल करें)। मैं केवल डालने के लिए क्लाइंट अनुप्रयोगों से सामग्री प्रदाता तक पहुंच प्रतिबंधित करना चाहता हूं और शायद क्वेरी विधियां।

मैं नहीं है क्या करना चाहते हैं:

  • सामग्री प्रदाता निजी क्योंकि मुख्य लक्ष्य क्लाइंट अनुप्रयोग के लिए एक डेटाबेस प्रदान करने के लिए है।
  • क्लाइंट अनुप्रयोगों के हस्ताक्षर के साथ पहुंच प्रतिबंधित करें क्योंकि कोई भी क्लाइंट एप्लिकेशन लिखने में सक्षम होना चाहिए जो मुख्य एप्लिकेशन प्लेटफ़ॉर्म का उपयोग करता है।

सबसे स्पष्ट समाधान जो मैं देखता हूं वह दो सामग्री प्रदाता लिखना है, जिसमें मुख्य एप्लिकेशन के पूर्ण पहुंच निजी और एक प्रतिबंधित सार्वजनिक है। लेकिन मुझे लगता है कि यह निश्चित रूप से एक उचित तरीका नहीं है।

इस Google groups post के अनुसार, मैं सामग्री प्रदाता में Binder.getCallingUid() का उपयोग करने के लिए कॉल कर रहा हूं यह पता लगाने के लिए कि क्या कॉल मुख्य एप्लिकेशन से आता है या नहीं। इसलिए मैं अपडेट और विधियों को हटा सकता हूं यदि कॉल मुख्य एप्लिकेशन से नहीं आती है।

तुलना करने के लिए मैं मुख्य आवेदन यूआईडी कैसे प्राप्त कर सकता हूं? और यदि यह संभव है, तो क्या यह समाधान सुरक्षित है?

आपकी सलाह के लिए धन्यवाद।

+0

यदि मैं सही ढंग से समझता हूं, तो सामग्री प्रदाता घटक वाला एप्लिकेशन केवल लेखन पहुंच वाला होना चाहिए। उसमें सामग्री प्रदाता इंटरफ़ेस के माध्यम से बिना कार्यक्षमता का उपयोग क्यों नहीं किया जा सकता है? उस स्थिति में सामग्री प्रदाता केवल क्वेरी इंटरफ़ेस का समर्थन करेगा। – Sameer

+0

दुर्भाग्यवश, क्लाइंट अनुप्रयोगों द्वारा आवश्यक मुख्य पहुंच सम्मिलन है। इसलिए उन्हें लेखन पहुंच भी चाहिए। लेकिन आप सही हैं कि मुख्य प्रदाता सामग्री प्रदाता का उपयोग करने की आवश्यकता नहीं है लेकिन यह बहुत जटिलता और रखरखाव में वृद्धि करेगा। – FabiF

+0

अच्छी तरह से, अभी भी एक ही बिंदु।मुख्य अनुप्रयोग सामग्री प्रदाता इंटरफ़ेस के बिना सीधे आवेषण, अद्यतन और हटा देता है। सामग्री प्रदाता केवल सम्मिलित और क्वेरी इंटरफ़ेस प्रदान करता है। – Sameer

उत्तर

8

ProtectionLevel हस्ताक्षर के साथ नीचे की तरह एक अनुमति को परिभाषित करें, यह लिखने की अनुमति केवल क्षुधा जो तब contentprovider टैग उपयोग पढ़ सकते हैं और अनुमति टैग लिखने में ही निजी कुंजी

<permission android:name="com.yourapp.WRITE.PERMISSION" 
    android:protectionLevel="signature" 
     android:label="@string/permission_label" 
     android:description="@string/permission_desc"> 
</permission> 

<permission android:name="com.yourapp.READ.PERMISSION" 
     android:label="@string/permission_label" 
     android:description="@string/permission_desc"> 
</permission> 

के साथ हस्ताक्षर किए के लिए प्रतिबंधित होगा। आप या तो लागू अनुमति पढ़ सकते हैं या आप पूरी तरह यह

android:readPermission="com.yourapp.READ.PERMISSION" 
android:writePermission="com.yourapp.WRITE.PERMISSION" 

तो केवल क्षुधा है कि एक ही हस्ताक्षर के हस्ताक्षर होते हैं

संपादित अपनी सामग्री प्रदाता का उपयोग कर सकते हैं को दूर कर सकते हैं:

हो सकता है कि आप इस

इस्तेमाल कर सकते हैं
private Collection<String> getCallingPackages() { 
    int caller = Binder.getCallingUid(); 
    if (caller == 0) { 
     return null; 
    } 
    return Lists.newArrayList(mContext.getPackageManager().getPackagesForUid(caller)); 
} 

और जांचें कि क्या इस पैकेज में आपका पैकेजगेम मौजूद है या नहीं। मुझे लगता है कि यह सुरक्षित है

+0

मुझे इस समाधान के बारे में पता है लेकिन मेरे मामले में, क्लाइंट अनुप्रयोगों को * डेटा * सम्मिलित करने में सक्षम होना चाहिए, इसलिए उन्हें लेखन पहुंच की भी आवश्यकता है। – FabiF

+0

तब आप क्या प्रतिबंधित करना चाहते हैं? packagename द्वारा केवल कुछ क्लाइंट अनुप्रयोगों? – nandeesh

+0

यदि आपके स्वयं के ऐप को डेटा की आवश्यकता है तो इसे sqlitedbhelper के माध्यम से करें और contentprovider – nandeesh

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