8

PhoneStateIntentReceiverまたはPhoneStateListenerを使用せずに、BroadcastReceiverを拡張してOSのブロードキャストをリッスンすることにより、着信をリッスンする方法はありますか? また、マニフェストのアクションとパーミッションはどうなるか教えてください。

次のように試してみましたが、着信では機能しませんが、発信では機能します

アプリの唯一の.javaファイルは次のとおりです(アプリは1つの.javaファイルと1つのマニフェストファイルのみ)

package com.crsardar.media.audio;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class IncommingCallReceiverCRS extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("Chitta : ", "Its working");          
    }
}

マニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.crsardar.media.audio"
      android:versionCode="1"
      android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">

    <receiver android:name="IncommingCallReceiverCRS" android:enabled="true"> 
        <intent-filter>
            <!--action android:name="android.intent.action.NEW_OUTGOING_CALL"/-->
            <action  android:name="android.intent.action.ANSWER" >
            <category  android:name="android.intent.category.DEFAULT" /> 
        </intent-filter>
    </receiver>

  </application>

  <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>
4

2 に答える 2

8

マニフェストで定義したアクションが正しくありません。これは、着信を監視するのではなく、通話に応答するために使用できるアクション インテントです。

ACTION_PHONE_STATE_CHANGEDおよびNEW_OUTGOING_CALLブロードキャスト インテントをリッスンする 2 つのブロードキャスト レシーバを使用できます。

ACTION_PHONE_STATE_CHANGED は、新しい着信、通話応答、またはハングアップが発生したときに受信されます (このインテントで受信した EXTRA については、ドキュメントを参照してください)。

NEW_OUTGOING_CALL は、デバイスに新しい発信コールがあると受信されます。

権限については、マニフェストでほぼ正しいと思います( RECORD_AUDIO 権限は、アプリケーションの他の何かに使用されていると思います)

于 2011-05-20T13:41:35.257 に答える
0

Here is My demo for android unit test. You can refer to it.

public interface ICallVerify {
    void onOutgoing(Context context, Intent intent);
    void onCallStateChange(Context context, Intent intent);
}

protected void setUpCallVerify(final ICallVerify callVerify) {  //listen ingoing and outgoing
    final CountDownLatch latch = new CountDownLatch(1);
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
                Log.i(TAG, "outgoing call...");
                callVerify.onOutgoing(context, intent);
            } else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
                String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                if (state.equals("RINGING")) {
                    state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                }
                Log.i(TAG, "call state changed.... " + state);
                callVerify.onCallStateChange(context, intent);
            }
        }
    };

    IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
    ContextUtils.getTargetContext().registerReceiver(receiver, filter);

    try {
        latch.await(5, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Dont forget to add permissions

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
于 2016-03-03T09:59:42.950 に答える