hey all when installing my app to the emulator I get this:
ERROR/AndroidRuntime(465): java.lang.RuntimeException: Unable to start receiver com.myPackage.Widget.MYWidget: java.lang.SecurityException: Not allowed to start service Intent { cmp=com.myPackage/.Widget.MYWidget$MyWidgetService } without permission android.permission.BIND_REMOTEVIEWS
here is the code from my manifest
<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name=".Widget.MYWidget" android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<!--Broadcast Receiver that will also process our self created action -->
<action android:name="com.temp.package.Widget.MYWidget.ACTION_WIDGET_LEFT_RECEIVER" />
<action android:name="com.temp.package.Widget.MYWidget.ACTION_WIDGET_PROGRESSBAR_RECEIVER" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/mywidget_widget_provider" />
</receiver>
<service android:name=".Widget.MYWidget$MyWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="true" />
<uses-permission
android:name="android.permission.BIND_REMOTEVIEWS"></uses-permission>
this is my code
public class MyWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Intent svcIntent = new Intent(context, MyWidgetService.class);
//svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
context.startService(svcIntent);
}
public static class MyWidgetService extends Service
{
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startI开发者_如何学编程d);
// Update the widget
RemoteViews remoteView = buildRemoteView(this);
// Push update to homescreen
pushUpdate(remoteView);
// No more updates so stop the service and free resources
stopSelf();
}
public RemoteViews buildRemoteView(Context context)
{
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
//do stuff
return remoteViews;
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
int oldOrientation = this.getResources().getConfiguration().orientation;
if(newConfig.orientation != oldOrientation)
{
// Update the widget
RemoteViews remoteView = buildRemoteView(this);
// Push update to homescreen
pushUpdate(remoteView);
}
}
private void pushUpdate(RemoteViews remoteView)
{
ComponentName myWidget = new ComponentName(this, MyWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(myWidget, remoteView);
}
@Override
public IBinder onBind(Intent arg0)
{
// TODO Auto-generated method stub
return null;
}
}
Get rid of:
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="true"
from your <service>
element, as neither are needed here. This should clear up your problem.
it's almost working, I'm in vertical mode when I add the Widget. when on orientation change happens(To Horizontal) - I thought that onConfigurationChanged should be called but it is not- thus my widget is not working after
For this you need to mention the android:configChanges parameter for which you want to handle your on. Please not if you working on ICS code you need to put 'screenSize' element also there with other parameters like 'keyboardHidden|screenSize' Hope this will help you.
I mentioned this for activity only...I took your question wrongly. Thanks for update.
精彩评论