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.dlogcat の出力に表示されるので問題なく動作しますが、ウィジェットをタップしても何も起こりません。logcat に表示される他のエラー メッセージはありません。私が間違っていることはありますか?

更新: setOnClickPendingIntent を変更して、ID「callbutton」( remoteViews.setOnClickPendingIntent(R.id.callbutton, clickPI);) を持つボタンを参照し、次の 3 行のコードを 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

Alright, so I have a bit of a workaround to this problem that will have to do until I find an actual solution. This involves launching an activity that in turn launches the intent I want. I initially wanted to avoid this, but oh well.

My new code, for anyone that might need it:

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;
    }

}
于 2013-08-02T08:47:22.673 に答える
1

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

レイアウト内のビューを参照する必要があります。レイアウトではありません。

編集:これがメソッド全体である場合、呼び出しも欠落していappWidgetmanager.updateWidgetAppWidget(...)ます。

EDIT 2:getBroadcast(...)実際にメッセージを受信者にブロードキャストしたいときに使用します。アクティビティを呼び出すには、 が必要getActivity(...)です。

于 2013-06-28T14:06:48.167 に答える
0

ACTION_DIALではなく、使用してくださいACTION_CALL

ドキュメントを参照してください。たとえば、システム インテントの要件を取得するための Common Intents に関するガイド、たとえば、電話を開始する方法、およびACTION_CALL に関するドキュメントには、次のように記載されています。

注: 通話を開始できるアプリケーションには制限があります。ほとんどのアプリケーションはACTION_DIALを使用する必要があります。

また:

... Log.d メソッドが機能し、ウィジェットが正常に更新されることを示唆しています ...

成功Log.d()は、コードがそこに到達したことを示しています (ブレークポイントはこれを判断する別の方法です) が、ウィジェットが正常に更新されたという証拠はありません。そこには、ウィジェットが更新され、問題はその後にあるという有用な仮説があります。たとえば、意図が間違っているなどです。その仮説をテストする 1 つの方法は、更新によってウィジェットが視覚的に変更されるようにすることです (例: TextView 内のテキスト)。

于 2014-02-20T18:47:10.447 に答える