开发者

java.lang.SecurityException: Not allowed to start service Intent

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜