1

完整的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 上没有显示其他错误消息。有什么我做错了吗?

更新:将 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.getBroadcastPendingIntent clickPI=PendingIntent.getActivity也不做任何事情。

4

3 回答 3

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");

}

调用活动.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;
    }

}
于 2013-08-02T08:47:22.673 回答
1

remoteViews.setOnClickPendingIntent(R.layout.callwidget_layout, clickPI);

您应该在布局中引用视图。不是布局。

编辑:如果这是整个方法,你也错过了appWidgetmanager.updateWidgetAppWidget(...)电话。

编辑 2:getBroadcast(...)当您真正想向接收者广播消息时使用。对于您需要的呼叫活动getActivity(...)

于 2013-06-28T14:06:48.167 回答
0

使用ACTION_DIAL,不使用ACTION_CALL

请参阅文档。例如,获取系统意图要求的通用意图指南,例如如何发起电话呼叫ACTION_CALL 上的文档说:

注意:哪些应用可以发起呼叫会有限制;大多数应用程序应该使用ACTION_DIAL

还:

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

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

于 2014-02-20T18:47:10.447 回答