当前位置: 首页 > 知识库问答 >
问题:

Android系统中通话时的来电号码?

丁星火
2023-03-14

我正在运行以下代码,其编译,但我没有得到任何结果或土司显示,请帮助。。。

CustomBroadcastReceiver.java该类将接收动作电话状态更改,并将实例化为Customephonestatelistener

public class CustomBroadcastReceiver extends BroadcastReceiver {

TelephonyManager telephony = 
(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(context);

telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);


Bundle bundle = intent.getExtras();
String phoneNr= bundle.getString("incoming_number");
    Log.v(TAG, "phoneNr: "+phoneNr);
    Toast toast = Toast.makeText(context, "phoneNr: "+phoneNr, Toast.LENGTH_LONG);
    toast.show();
}
}

CustomPhonestateListener。JAVA

这个类是主操作类

public class CustomPhoneStateListener extends PhoneStateListener {

private static final String TAG = "CustomPhoneStateListener";

private Context mContext;

public CustomPhoneStateListener(Context context) {


// TODO Auto-generated constructor stub
mContext = context;
}

public void onCallStateChanged(int state, String incomingNumber){

    Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!");

     Log.v(TAG, incomingNumber);
    Toast toast = Toast.makeText(mContext, "WE ARE INSIDE!!!!!!!!!!!", Toast.LENGTH_LONG);
    toast.show();

    switch(state){
            case TelephonyManager.CALL_STATE_RINGING:
                    Log.d(TAG, "RINGING");
                    break;
    }       

AndroidManifest。xml

  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_CONTACTS" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                    <action android:name="android.intent.action.PHONE_STATE" />

            </intent-filter>
    </receiver>
</application>

共有3个答案

夏弘义
2023-03-14

"但现在的问题是我必须重新启动设备才能启动这项服务...任何建议,我错了吗??"

您必须重新启动手机的原因是在您的AndroidManifest中。您只允许执行一个操作的xml文件。。。

<!-- Your Problem is here -->
<action android:name="android.intent.action.BOOT_COMPLETED" />

您已经将BroadcastRecector设置为仅在手机启动时启动。
要解决此问题,您需要使用DR VOLT提供的答案。

只需将操作PHONE_STATE和NEW_OUTGOING_CALL添加到您的接收器
例如:

<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.BOOT_COMPLETED" />           
</intent-filter>
</receiver>

当这些动作发生时,这将启动广播接收器。

鲁华茂
2023-03-14

问题在你的清单文件中,你必须有这个:

<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />                
</intent-filter>
</receiver>

而不是:

<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />                
</intent-filter>
</receiver>
鄢承运
2023-03-14

谢谢你的回答。。。我尝试了另一种方法,下面的代码似乎有效。。已加入receiver和phonestatelistener。。但现在的问题是我必须重新启动设备才能启动此服务。。有没有任何关于我现在错在哪里的建议??

public class IncomingCallReciever extends BroadcastReceiver {

private Context mContext;
private Intent mIntent;

@Override
public void onReceive(Context context, Intent intent) {
    mContext = context;
    mIntent = intent;
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    int events = PhoneStateListener.LISTEN_CALL_STATE;
    tm.listen(phoneStateListener, events);
}

private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        String callState = "UNKNOWN";
        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:
            callState = "IDLE";
            break;
        case TelephonyManager.CALL_STATE_RINGING:
            // -- check international call or not.
            if (incomingNumber.startsWith("00")) {
                Toast.makeText(mContext,"International Call- " + incomingNumber,Toast.LENGTH_LONG).show();
                callState = "International - Ringing (" + incomingNumber+ ")";
            } else {
                Toast.makeText(mContext, "Local Call - " + incomingNumber, Toast.LENGTH_LONG).show();
                callState = "Local - Ringing (" + incomingNumber + ")";
            }
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            String dialingNumber = mIntent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            if (dialingNumber.startsWith("00")) {
                Toast.makeText(mContext,"International - " + dialingNumber,Toast.LENGTH_LONG).show();
                callState = "International - Dialing (" + dialingNumber+ ")";
            } else {
                Toast.makeText(mContext, "Local Call - " + dialingNumber,Toast.LENGTH_LONG).show();
                callState = "Local - Dialing (" + dialingNumber + ")";
            }
            break;
        }
        Log.i(">>>Broadcast", "onCallStateChanged " + callState);
        super.onCallStateChanged(state, incomingNumber);
    }
};

}
 类似资料:
  • 背景: 我为android写了一个简单的小拨号器,可以拨打联系人的电话号码 问题: 我想打电话给联系人,而不是电话号码,这样Android: 如果联系人有两个号码:将启动电话号码选择对话框,然后启动通话 当然,我可以从头开始实现一个弹出窗口,但我更愿意委托给一个标准操作,这样用户就可以使用与使用标准拨号器相同的用户体验。

  • 我想从Android的联系簿中获得电话号码。我尝试了许多方法,但我无法获得电话号码。我有联系人姓名和状态,但当我尝试获取电话号码时,它不起作用。我的代码是。

  • 我想弄清楚这个验证手机号码到我的Android系统是如何工作的。 我已经添加了代码和whant来验证46123456789,但最后一个号码(9)没有添加到电话号码中。 我用的是: 我是不是错过了什么

  • 问题内容: 我正在尝试根据给定的联系人电话号码检索联系人姓名。我做了一个可以在所有API版本中使用的函数,因为我无法使其在1.6版中运行,而且我也看不到问题所在,也许有人可以发现它? 请注意,我已经为字符串替换了API常量,因此没有过时的警告问题。 问题答案: 使用反射而不是比较sdk版本。

  • 我正在开发一个用于录制通话的应用程序。这是我的代码片段。 这适用于android 7以下的设备,但当我使用Android 7移动设备时,我只能听到传出的声音,但听不到传入的声音。 有人能帮我修理它吗?

  • 问题内容: 我正在尝试删除特定号码的所有通话记录。 我想触发查询,因为保存在callLog中的mobNum是+916666666666,我正在传递号码6666666666。因此它不匹配。有人可以帮助我克服这个问题吗? 问题答案: 检查以下链接: 在Android中删除通话记录 SO:通话结束后从通话记录中删除通话