Android系统获取用户来电信息

在onCreate()方法中加入以下语句:
MyPhoneStateListener phoneListener=new MyPhoneStateListener(); 
        TelephonyManager telephonyManager =(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);

然后创建MyPhoneStateListener类
public class MyPhoneStateListener extends PhoneStateListener {
            Context context;
            public void onCallStateChanged(int state, String incomingNumber) {
                        if((!(incomingNumber.isEmpty()))&&state == TelephonyManager.CALL_STATE_RINGING){
                            String m=getContactNameFromPhoneBook(AppContext.getContext(), incomingNumber);
                            Log.e("PhoneCallState", "来电: " + m);     
                        }
            }
        }   


其中incomingNumber就是来电号码,注意观察onCallStateChanged()方法中的第一个参数,第一个参数意为状态。因为我们只想获取来电信息,所以加入判断,当电话状态为TelephonyManager.CALL_STATE_RINGING 时我们才将获取到的电话进行显示。

然后,为了更加的便利,我们加入getContactNameFromPhoneBook() 方法访问用户的电话薄。如果为手机通信录联系人,将显示联系人信息;如果为陌生号码,将直接显示号码。

获取姓名
public String getContactNameFromPhoneBook(Context context, String phoneNum) {
     String contactName = "";
     String[] projection = { ContactsContract.PhoneLookup.DISPLAY_NAME,
         ContactsContract.PhoneLookup.NUMBER};
     Uri uri = Uri.withAppendedPath(
          ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
           Uri.encode(phoneNum));
          Cursor cursor = context.getContentResolver().query(uri, projection,null, null, null);
          if (cursor.moveToFirst()) {
            contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                cursor.close();
                return contactName;
            }
            else{
                return phoneNum;
            }
        }

注意观察这个方法的第一个参数为上下文Context

有一个简便的获取上下文Context的方法

public class AppContext extends Application {
    private static Context instance;
    @Override
    public void onCreate()
    {
        instance = getApplicationContext();
    }

    public static Context getContext()
    {
        return instance;
    }
}



这样就可以通过AppContext.getContext()在任何地方获取到Context了

最后记得在配置文件中加入权限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

并且在 <application></application>中加入android:name="com.mt.ble.mtble.AppContext" 来声明我们刚刚创建的AppContext,一定要写全路径。

这样我们就可以成功获取到来电信息了微笑
展开阅读全文

没有更多推荐了,返回首页