Android获取来电手机号
在Android开发中,有时候我们需要获取来电手机号,例如用于用户认证、号码识别等功能。本文将介绍如何实现在Android设备上获取来电手机号的方法,并提供相关代码示例。
1. 前提条件
在开始之前,我们需要确保以下条件已满足:
- Android设备上有SIM卡,并且SIM卡支持来电显示功能。
- App已获取相应的权限,包括
READ_PHONE_STATE
和READ_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