小部件和setOnClickPendingIntent

时间:2013-06-28 13:55:49

标签: android android-widget android-pendingintent

在这里完成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也无效。

3 个答案:

答案 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 calldocumentation on ACTION_CALL说:

  

注意:应用程序可以启动的限制   呼叫;大多数应用程序应使用ACTION_DIAL

此外:

  

... Log.d方法有效,表明小部件更新正常......

成功的Log.d()表明代码到达那里(断点将是确定这一点的另一种方法),但它没有证明小部件已成功更新。你有一个有用的假设,即小部件得到更新,问题出现在那之后,例如:错误的意图。测试该假设的一种方法是使您的更新明显改变小部件,例如TextView中的文本。