java.lang.SecurityException:不允许启动服务意图
Posted
技术标签:
【中文标题】java.lang.SecurityException:不允许启动服务意图【英文标题】:java.lang.SecurityException: Not allowed to start service Intent 【发布时间】:2011-11-27 23:38:27 【问题描述】:嘿,当我将我的应用程序安装到模拟器时,我得到了这个:
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 未经许可 android.permission.BIND_REMOTEVIEWS
这是我清单中的代码
<!-- 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>
这是我的代码
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;
【问题讨论】:
【参考方案1】:摆脱:
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="true"
来自您的 <service>
元素,因为这里都不需要。这应该可以解决您的问题。
【讨论】:
@Elad Gelman:我不知道你在说什么,而且它似乎与这个问题无关。请考虑开始一个新问题并解释更多。【参考方案2】:它几乎可以工作了,我在添加小部件时处于垂直模式。当方向改变发生时(到水平) - 我认为应该调用 onConfigurationChanged 但它不是 - 因此我的小部件在之后无法工作
为此,您需要提及您想要处理的 android:configChanges 参数。 如果您使用 ICS 代码,请不要将“screenSize”元素与其他参数(如“keyboardHidden|screenSize”)一起放在那里 希望这会对你有所帮助。
我提到这个只是为了活动......我错误地回答了你的问题。 感谢更新。
【讨论】:
我认为你错了,on configchanges 仅在活动上调用,这是一个正在运行的服务。 Android Widgets 存在问题 - 每次从主屏幕调用 configChanges 时,整个 UI 元素都会被销毁和重建(Widgets 也是如此),必须更好地正确绑定它们。以上是关于java.lang.SecurityException:不允许启动服务意图的主要内容,如果未能解决你的问题,请参考以下文章