java.lang.SecurityException: Not allowed to start service Intent
Asked Answered
M

2

1

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, startId);
        // 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;
    }
}
Misdeem answered 29/9, 2011 at 19:35 Comment(0)
B
6

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.

Bibliographer answered 29/9, 2011 at 20:29 Comment(1)
@Elad Gelman: I have no idea what you are talking about, and it does not seem related to this question. Please consider starting a new question and explaining a bit more.Bibliographer
S
0

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.

Sino answered 4/1, 2012 at 8:43 Comment(1)
I think you are wrong, on configchanges is called only on activities, and this is a service running. there is a problem with Android Widgets- every time configChanges is called from the main screen the whole UI elements are being destroyed and rebuilt ( Widgets as well) there has to be a better why to bind them properly.Misdeem

© 2022 - 2024 — McMap. All rights reserved.