2

私は初心者のAndroid開発者です。
誰かが私に電話をかけた場合にエントリを更新する必要があるため、ActivityからBroadcastReceiverを呼び出そうとしています。

これは私がBroadcastReceiverと呼んでいる活動です。

ソースコード:

public class CalendarCall extends Activity {

    private static final String TAG = "CalendarCall";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent i = new Intent(this, MyBroadcastReceiver.class);
        startActivity(i);
    }  
    // ......
}

MyBroadcastReceiver.class:

package org.example.calendarcall;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         Bundle extras = intent.getExtras();
         if (extras != null) {
                String state = extras.getString(TelephonyManager.EXTRA_STATE);
                Log.w("DEBUG", state);
                if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                    String phoneNumber = extras
                            .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Log.w("DEBUG", phoneNumber);
                }
         }
     }
}

マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example.calendarcall"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".CalendarCall"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="MyBroadcastReceiver">
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
</manifest> 

エラー:

04-21 12:37:40.821: ERROR/AndroidRuntime(793): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.calendarcall/org.example.calendarcall.CalendarCall}: android.content.ActivityNotFoundException: Unable to find explicit activity class {org.example.calendarcall/org.example.calendarcall.MyBroadcastReceiver}; 

問題はマニフェストでの宣言であると思います。また、以下を使用してアクティビティからBroadcastReceiverを呼び出すことができるかどうかもわかりません。

Intent i = new Intent(this, MyBroadcastReceiver.class);
startActivity(i);
4

2 に答える 2

2

BroadCastReceiverは、sendBroadcast()メソッドを呼び出している送信者からインテントを受け取ります。誰かがあなたに電話をかけたときにMyBroadcastReceiverを呼び出したい場合は、次のようなフィルターandroid.intent.action.PHONE_STATEを追加できます。

  <receiver android:name=".MyBroadcastReceiver">

    <intent-filter>

      <action android:name="android.intent.action.PHONE_STATE" />

    </intent-filter>

</receiver>

CalendarCallアクティビティは実際には必要ありません。

ブロードキャストレシーバーからアクティビティに情報を転送する場合は、このスタックオーバーフローの質問を参照してください。

于 2011-04-21T10:59:45.593 に答える
0

アクティビティからブロードキャスト受信者を呼び出すことができます。受信者を登録および登録解除する必要があり、コードでもsendbroadcastereciver()を呼び出す必要があります

于 2011-04-21T10:57:52.307 に答える