इसलिए मैंने अभी अपने ऐप के लिए एक विजेट लागू किया है। यह मेरे 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 आवश्यकता को हटा देता हूं तो सब कुछ खूबसूरती से काम करता है। लेकिन यह एक सुरक्षा समस्या की तरह प्रतीत होता है क्योंकि तब कोई ऐप उपयोगकर्ता को बिना किसी स्वीकृति के प्रदाता तक पहुंच सकता है।
तो क्या विजेट के साथ रीडप्रमिशन के साथ प्रदाता का उपयोग करने का कोई तरीका है? या आप एक असुरक्षित निर्यात प्रदाता का उपयोग करने के लिए मजबूर हैं?
मैं ठीक उसी समस्या हो रही है, आप किसी भी समाधान अभी तक मिला:
तो कुंजी यह करने के लिए है? यदि हां, तो क्या आप कृपया उत्तर के रूप में वर्णन कर सकते हैं कि आपने इसे कैसे ठीक किया? –
दुख की बात नहीं। कोई समाधान नहीं मिला, इसलिए मैंने केवल आवश्यक अनुमति हटा दी :( –
यह समस्या भी है ... – JMRboosties