在这里完成android开发新手,请注意。
我正在尝试开发一个主屏幕小部件,允许您点按小部件来调用预定义的数字。我可以创建窗口小部件并将其添加到主屏幕,但是,当我尝试使用setOnClickPendingIntent
使窗口小部件可单击时,它不会启动活动。我正在使用的代码如下:
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.callwidget_layout);
Log.d("stuff", "remoteview defined");
Intent callIntent = new Intent(Intent.ACTION_CALL);
Log.d("stuff", "intent created");
callIntent.setData(Uri.parse("tel:"+8888888));
Log.d("stuff", "intent data added");
PendingIntent clickPI=PendingIntent
.getBroadcast(context, 0,
callIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Log.d("stuff", "pending intent created");
remoteViews.setOnClickPendingIntent(R.layout.callwidget_layout, clickPI);
Log.d("stuff", "setonclickpendingintent created");
}
Log.d
方法工作正常,因为它们出现在logcat输出上,但点击小部件什么都不做。在logcat上没有显示其他错误消息。我有什么问题吗?
UPDATE:更改了setOnClickPendingIntent以引用ID为“callbutton”(remoteViews.setOnClickPendingIntent(R.id.callbutton, clickPI);
)的按钮,并尝试将这三行代码添加到onUpdate方法中:
ComponentName myWidget = new ComponentName(context, WidgetProvider.class);
appWidgetManager.getInstance(context).updateAppWidget(myWidget, remoteViews);
Log.d("stuff", "widget updated");
同样,Log.d
方法有效,建议小部件更新正常,但点按按钮仍然无法执行任何操作。
更新2 :将PendingIntent clickPI=PendingIntent.getBroadcast
更改为PendingIntent clickPI=PendingIntent.getActivity
也无效。
答案 0 :(得分:2)
好吧,所以我有一个解决这个问题的方法,直到我找到一个实际的解决方案。这涉及启动一个活动,然后启动我想要的意图。我最初想避免这种情况,但很好。
我的新代码,适用于任何可能需要它的人:
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.callwidget_layout);
Log.d("stuff", "remoteview defined");
Intent callIntent = new Intent(context, CallActivity.class);
PendingIntent clickPI=PendingIntent
.getActivity(context, 0,
callIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Log.d("stuff", "pending intent created");
remoteViews.setOnClickPendingIntent(R.id.callbutton, clickPI);
Log.d("stuff", "setonclickpendingintent created");
ComponentName myWidget = new ComponentName(context, WidgetProvider.class);
appWidgetManager.getInstance(context).updateAppWidget(myWidget, remoteViews);
Log.d("stuff", "widget updated");
}
CallActivity.java:
package com.example.callzepolice;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
public class CallActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_call);
Intent callIntent = new Intent(Intent.ACTION_CALL);
Log.d("stuff", "intent created");
callIntent.setData(Uri.parse("tel:"+8888888));
Log.d("stuff", "intent data added");
startActivity(callIntent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.call, menu);
return true;
}
}
答案 1 :(得分:1)
remoteViews.setOnClickPendingIntent(R.layout.callwidget_layout, clickPI);
您应该在布局中引用视图。不是布局。
编辑:如果这是整个方法,您也错过了appWidgetmanager.updateWidgetAppWidget(...)
电话。
编辑2:当您确实想要向接收者广播消息时,使用getBroadcast(...)
。对于调用活动,您需要getActivity(...)
。
答案 2 :(得分:0)
使用ACTION_DIAL
,而不是ACTION_CALL
。
请参阅文档。例如。 Common Intents指南,用于获取系统意图的要求,例如: how to initiate a phone call和documentation on ACTION_CALL说:
注意:应用程序可以启动的限制 呼叫;大多数应用程序应使用ACTION_DIAL。
此外:
... Log.d方法有效,表明小部件更新正常......
成功的Log.d()
表明代码到达那里(断点将是确定这一点的另一种方法),但它没有证明小部件已成功更新。你有一个有用的假设,即小部件得到更新,问题出现在那之后,例如:错误的意图。测试该假设的一种方法是使您的更新明显改变小部件,例如TextView中的文本。