Android获取来电手机号

在Android开发中,有时候我们需要获取来电手机号,例如用于用户认证、号码识别等功能。本文将介绍如何实现在Android设备上获取来电手机号的方法,并提供相关代码示例。

1. 前提条件

在开始之前,我们需要确保以下条件已满足:

  • Android设备上有SIM卡,并且SIM卡支持来电显示功能。
  • App已获取相应的权限,包括READ_PHONE_STATEREAD_CALL_LOG权限。

2. 获取来电手机号的方法

2.1 使用TelephonyManager获取

Android提供了TelephonyManager类,用于访问与电话相关的信息。我们可以使用这个类来获取来电手机号。

首先,在你的AndroidManifest.xml文件中添加以下权限声明:

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

然后,在你的代码中使用以下方法获取来电手机号:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String phoneNumber = telephonyManager.getLine1Number();

上述代码中,我们通过调用getLine1Number()方法来获取来电手机号。需要注意的是,有些手机厂商可能不会在SIM卡中存储手机号,因此这个方法返回的值可能为空。此外,该方法还需要权限READ_PHONE_STATE进行访问。

2.2 使用CallLog获取

除了使用TelephonyManager,我们还可以通过查询通话记录来获取来电手机号。

首先,在你的AndroidManifest.xml文件中添加以下权限声明:

<uses-permission android:name="android.permission.READ_CALL_LOG" />

然后,在你的代码中使用以下方法获取来电手机号:

String phoneNumber = null;
String[] projection = new String[] { CallLog.Calls.NUMBER };
String selection = CallLog.Calls.TYPE + " = ? AND " + CallLog.Calls.NEW + " = ?";
String[] selectionArgs = new String[] { String.valueOf(CallLog.Calls.INCOMING_TYPE), "1" };
String sortOrder = CallLog.Calls.DATE + " DESC";

Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.moveToFirst()) {
    phoneNumber = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
    cursor.close();
}

上述代码中,我们通过查询通话记录来获取来电手机号。首先,我们定义了所需的查询字段、查询条件和排序方式。然后,使用getContentResolver().query()方法执行查询,并通过moveToFirst()getColumnIndex()方法获取来电手机号。此外,我们还需要权限READ_CALL_LOG进行访问。

3. 完整示例

下面是一个完整的示例,演示如何获取来电手机号:

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.telephony.TelephonyManager;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (checkPermission()) {
            getPhoneNumber();
        } else {
            requestPermission();
        }
    }

    private boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
        return result == PackageManager.PERMISSION_GRANTED;
    }

    private void requestPermission() {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_PHONE_STATE }, PERMISSION_REQUEST_CODE);
    }

    private void getPhoneNumber() {
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String phoneNumber = telephonyManager.getLine1Number();

        if (phoneNumber != null && !phoneNumber.isEmpty()) {
            Toast.makeText(this, "来电手机号:" + phoneNumber, Toast.LENGTH_LONG).show();
        } else {
            getPhoneNumberFromCallLog();
        }
    }

    private void getPhoneNumberFromCallLog() {
        String phoneNumber = null;
        String[] projection = new String[] { CallLog.Calls.NUMBER };
        String selection = CallLog.Calls.TYPE + " = ? AND " + CallLog.Calls.NEW + " = ?";
        String[] selectionArgs = new String[] { String.valueOf(CallLog.Calls.INCOMING_TYPE), "1" };
        String sortOrder = CallLog.Calls.DATE + " DESC";

        Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
        if (cursor != null && cursor.moveToFirst