【问题标题】:Start Activity from RemoteViewsFactory从 RemoteViewsFactory 启动 Activity
【发布时间】:2014-07-23 14:00:07
【问题描述】:

我在应用小部件中有一个应用启动器。我会从 RemoteViewsFactory 启动 Activity。 但它没有用。

这是我在 RemoteViewsFactory 中的代码:

@Override
public RemoteViews getViewAt(int position) {

    RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.app_item);

    ResolveInfo info = mApps.get(position);
    Bundle extras = new Bundle();

    extras.putString(TheWidgetProvider.APP_ID, info.getClass().getName());
    Intent fillInIntent = new Intent();
    fillInIntent.putExtras(extras);
    rv.setOnClickFillInIntent(R.id.app_name, fillInIntent);

    return rv;

}

这是我来自 TheWidgetProvider 的代码:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {


       Intent AppsServiceIntent = new Intent(context, AppsService.class);
       AppsServiceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
       AppsServiceIntent.setData(Uri.parse(AppsServiceIntent.toUri(Intent.URI_INTENT_SCHEME)));
       views.setRemoteAdapter(R.id.GridViewApps, AppsServiceIntent);

       Intent appsIntent = new Intent(context, TheWidgetProvider.class);
       appsIntent.setAction(TheWidgetProvider.EVENT_SHOW_APP);
       appsIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
       appsIntent.setData(Uri.parse(updateServiceIntent.toUri(Intent.URI_INTENT_SCHEME)));
       PendingIntent appsPendingIntent = PendingIntent.getBroadcast(context, 0, appsIntent,
               PendingIntent.FLAG_UPDATE_CURRENT);
       views.setPendingIntentTemplate(R.id.GridViewApps, appsPendingIntent);  

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

有没有人知道为什么它不起作用?

【问题讨论】:

  • 你到底想做什么?此异常意味着您正在做的事情需要INTERACT_ACROSS_USERS_FULL 权限,但您的应用程序没有此权限。事实上,您不能拥有此权限。这是一个签名级别的权限,只有 Google 或 OEM 应用程序才能拥有签名级别的权限。因此,您正在尝试做一些普通开发人员不受限制的事情。无论如何,这是一个完全不同的问题。如果您就这个问题提出一个新问题会更好。
  • 如果它解决了PendingIntents 的原始问题,请在此处接受我的回答,并就新问题提出新问题。您基本上可以将这个问题的下半部分复制到新问题中。我也很乐意帮助您解决新问题,所以只需在 cmets 中发布新问题的链接,我会看一看。
  • 我不想用这些权限做任何事情。我只想从 appwidget 开始一个活动。我的应用程序显示一个包含已安装包的列表,如果用户单击已安装的应用程序之一,所选应用程序将打开它。
  • 嗯,你正在做一些你不应该做的事情。只需提出一个新问题,我相信我们会找到解决方案。 Stack Overflow 上的问题应该只针对一个问题。这个是关于PendingIntents 的问题,对于这个新问题,如果您提出一个新问题是合适的。

标签: java android android-appwidget appwidgetprovider android-remoteview


【解决方案1】:

错误在这里:

PendingIntent appsPendingIntent = PendingIntent.getBroadcast(context, 0, appsIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent.getBroadcast(...) 创建一个广播,你需要像这样使用PendingIntent.getActivity(...)

PendingIntent appsPendingIntent = PendingIntent.getActivity(context, 0, appsIntent, PendingIntent.FLAG_UPDATE_CURRENT);

【讨论】:

  • 谢谢 Xaver,我修改了我的代码,但它也不起作用。在我的 WidgetProvider 上:` Intent appsIntent = new Intent(context, AppsService.class);字符串 packageName = appsIntent.getStringExtra(APP_ID); appsIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); PendingIntent appsPendingIntent = PendingIntent.getActivity(context, 0, appsIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setPendingIntentTemplate(R.id.GridViewApps, appsPendingIntent); </code> code in backticks`,
  • 嗨,Xaver,正确。如何在评论中显示代码?
  • 注释不应该用于代码。改为编辑您的问题!
  • 但是仅供参考,你可以在cmets中用反引号做一个代码块!像这样,但在反引号旁边没有空格:`代码在这里`。您可以找到有关 Stack Overflow here 上使用的标记的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多