2012-02-29 12 views
15

इसलिए मैंने अभी अपने ऐप के लिए एक विजेट लागू किया है। यह मेरे ContentProvider के माध्यम से डेटाबेस से डेटा प्राप्त करता है। मैं अपने प्रकट घोषणा करता हूं कि मैं उन्हें का उपयोग करें (एक फर्क प्रतीत नहीं होता है) मेरे अपने पढ़ने/लिखने-अनुमतियां निर्धारित है, और उन्हें सामग्री प्रदाता में आवश्यकता होती है:विजेट; ReadPermission का उपयोग करना असंभव है?

<!-- Define my permissions for the provider --> 
<permission 
    android:name="com.nononsenseapps.notepad.permissions.read" 
    android:description="@string/permission_read_desc" 
    android:label="@string/permission_read_label" 
    android:permissionGroup="android.permission-group.PERSONAL_INFO" 
    android:protectionLevel="normal" /> 
<permission 
    android:name="com.nononsenseapps.notepad.permissions.write" 
    android:description="@string/permission_write_desc" 
    android:label="@string/permission_write_label" 
    android:permissionGroup="android.permission-group.PERSONAL_INFO" 
    android:protectionLevel="normal" /> 
...... 
<uses-permission android:name="com.nononsenseapps.notepad.permissions.read" /> 
<uses-permission android:name="com.nononsenseapps.notepad.permissions.write" /> 
<uses-permission android:name="android.permission.BIND_REMOTEVIEWS" /> 
...... 
<provider 
     android:name=".NotePadProvider" 
     android:authorities="com.nononsenseapps.NotePad" 
     android:enabled="true" 
     android:exported="true" 
     android:label="@string/app_name" 
     android:readPermission="com.nononsenseapps.notepad.permissions.read" 
     android:syncable="true" 
     android:writePermission="com.nononsenseapps.notepad.permissions.write" > 
     <grant-uri-permission android:pathPattern=".*" /> 
    </provider> 

मैं एक के माध्यम से अपने विजेट अद्यतन Service (के रूप में प्रति विजेट ट्यूटोरियल):

<!-- List Widget --> 
    <receiver android:name="com.nononsenseapps.notepad.widget.ListWidgetProvider" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/listwidgetinfo" /> 
    </receiver> 

    <service 
     android:name="com.nononsenseapps.notepad.widget.ListWidgetService" 
     android:exported="false" 
     android:permission="android.permission.BIND_REMOTEVIEWS" /> 

और बदले में कि Service (कोड का एक समूह शामिल नहीं) के साथ ऐसा करता है:

/** 
* This is the service that provides the factory to be bound to the collection 
* service. 
*/ 
public class ListWidgetService extends RemoteViewsService { 

@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) { 
    return new StackRemoteViewsFactory(this.getApplicationContext(), intent); 
} 
} 

/** 
* This is the factory that will provide data to the collection widget. 
*/ 
class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { 

public StackRemoteViewsFactory(Context context, Intent intent) { 
    mContext = context; 
    observer = new ListChecker(null); 
    mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
      AppWidgetManager.INVALID_APPWIDGET_ID); 
} 
public void onDataSetChanged() { 
    Log.d(TAG, "onDataSetChanged"); 
    // Refresh the cursor 
    if (mCursor != null) { 
     mCursor.close(); 
    } 

    // Get widget settings 
    SharedPreferences settings = mContext.getSharedPreferences(
      ListWidgetConfigure.getSharedPrefsFile(mAppWidgetId), 
      mContext.MODE_PRIVATE); 
    if (settings != null) { 
     String listWhere = settings.getString(ListWidgetConfigure.LIST_WHERE, null); 
     listId = settings.getLong(ListWidgetConfigure.LIST_ID, -1); 
     String sortOn = settings.getString(ListWidgetConfigure.SORT_ON, NotePad.Notes.ALPHABETIC_ASC_ORDER); 

     mCursor = mContext.getContentResolver().query(
       NotePadProvider.CONTENT_VISIBLE_URI, PROJECTION, listWhere, null, 
       sortOn); 
    } 
} 
} 

तो यहाँ समस्या है: जब मैं होमस्क्रीन पर विजेट जोड़ता हूं, तो प्रदाता से पूछताछ करने का प्रयास करते समय onDataSetChanged() विधि के अंदर तुरंत फेंक दिया जाता है। ऐसा प्रतीत होता है क्योंकि होमस्क्रीन में मेरे सामग्री प्रदाता को पढ़ने की अनुमति नहीं है। मेरा अंतर्ज्ञान यह था कि यह कोई समस्या नहीं होगी क्योंकि मेरे अपने ऐप की अनुमति है, और सेवा स्पष्ट रूप से मेरे ऐप का हिस्सा है।

अगर मैं प्रदाता से ReadPermission आवश्यकता को हटा देता हूं तो सब कुछ खूबसूरती से काम करता है। लेकिन यह एक सुरक्षा समस्या की तरह प्रतीत होता है क्योंकि तब कोई ऐप उपयोगकर्ता को बिना किसी स्वीकृति के प्रदाता तक पहुंच सकता है।

तो क्या विजेट के साथ रीडप्रमिशन के साथ प्रदाता का उपयोग करने का कोई तरीका है? या आप एक असुरक्षित निर्यात प्रदाता का उपयोग करने के लिए मजबूर हैं?

+0

मैं ठीक उसी समस्या हो रही है, आप किसी भी समाधान अभी तक मिला:

तो कुंजी यह करने के लिए है? यदि हां, तो क्या आप कृपया उत्तर के रूप में वर्णन कर सकते हैं कि आपने इसे कैसे ठीक किया? –

+0

दुख की बात नहीं। कोई समाधान नहीं मिला, इसलिए मैंने केवल आवश्यक अनुमति हटा दी :( –

+0

यह समस्या भी है ... – JMRboosties

उत्तर

13

मैं here का उत्तर खोजने में सक्षम था, क्रेडिट कोस्ट्या Vasilyev जाता है।

हालांकि संदर्भ वास्तव में सही है, यह गलत प्रक्रिया से जुड़ा हुआ है।

public void onDataSetChanged() { 
    // Revert back to our process' identity so we can work with our 
    // content provider 
    final long identityToken = Binder.clearCallingIdentity(); 

    // Update your cursor or whaterver here 
    // ... 

    // Restore the identity - not sure if it's needed since we're going 
    // to return right here, but it just *seems* cleaner 
    Binder.restoreCallingIdentity(identityToken); 
} 
+0

बिल्कुल सही प्रतिक्रिया। यह समस्या हल करता है, यहां तक ​​कि contentprovider पर पढ़ने/लिखने की अनुमतियों को सेट किए बिना, इसे निर्यात किए गए सेट के साथ "झूठी" में उपयोग कर रहा है। –

0

सबसे अधिक संभावना है, ऐसा इसलिए है क्योंकि आप विजेट के संदर्भ का उपयोग कर रहे हैं, जो कि होमस्क्रीन का होगा। अपने कोड में निम्न पंक्ति का प्रयास करें:

mCursor = ListWidgetService.this.getContentResolver().query(
      NotePadProvider.CONTENT_VISIBLE_URI, PROJECTION, listWhere, null, 
      sortOn); 

ध्यान दें कि मैंने mContext. को कैसे बदला। एक सेवा अपने आप का एक संदर्भ है, जिसमें आपके प्रकट होने के बाद सही अनुमति होनी चाहिए।

+0

दरअसल, यदि आप कोड देखते हैं तो आप देखते हैं कि रिमोट व्यूफैक्ट्री को संदर्भित किया गया संदर्भ बिल्कुल वही है जो आप सुझाते हैं। हालांकि, आपका उत्तर बनाया गया मैं आगे की जांच करता हूं और मैं समाधान ढूंढने में सक्षम था! इसे उत्तर के रूप में पोस्ट किया गया। –

+0

दरअसल, आप सही हैं, मुझे यकीन नहीं है कि मुझे यह कैसे याद आया :) लेकिन मुझे खुशी है कि यह आपको सही रास्ते पर रखता है :) –

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

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