. lang。SecurityException:不允许启动服务意图

时间:2022-10-12 00:06:55

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

错误/ AndroidRuntime(465):. lang。运行时异常:无法启动receiver com. packmyage . widget。MYWidget . lang。SecurityException:不允许启动服务意图{cmp=com.myPackage/. widget。未经允许的MYWidget$MyWidgetService} 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;
    }
}

2 个解决方案

#1


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.

从您的 <服务> 元素,这里不需要。这应该能解决你的问题。

#2


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

它几乎是工作的,当我添加小部件时处于垂直模式。当方向发生变化时(向水平方向)——我认为应该调用onConfigurationChanged方法,但实际上不是——因此我的小部件在那之后就不能工作了

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.

为此,您需要提到您想要处理的android:configChanges参数。如果您正在编写ICS代码,请不要将“screenSize”元素与“keyboardHidden|screenSize”等其他参数放在一起,希望这对您有所帮助。

I mentioned this for activity only...I took your question wrongly. Thanks for update.

我只在活动中提到过……我错误地回答了你的问题。谢谢你的更新。

#1


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.

从您的 <服务> 元素,这里不需要。这应该能解决你的问题。

#2


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

它几乎是工作的,当我添加小部件时处于垂直模式。当方向发生变化时(向水平方向)——我认为应该调用onConfigurationChanged方法,但实际上不是——因此我的小部件在那之后就不能工作了

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.

为此,您需要提到您想要处理的android:configChanges参数。如果您正在编写ICS代码,请不要将“screenSize”元素与“keyboardHidden|screenSize”等其他参数放在一起,希望这对您有所帮助。

I mentioned this for activity only...I took your question wrongly. Thanks for update.

我只在活动中提到过……我错误地回答了你的问题。谢谢你的更新。