免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Android 代碼實(shí)現(xiàn)來(lái)電攔截
為了更好地理解這個(gè)Demo,我先向大家介紹一下需求與功能。
需求:
每天都會(huì)有很多無(wú)聊的電話,比如推銷商品等,占用我們大量時(shí)間不說(shuō),有時(shí)候還會(huì)打亂我們的思路,擾亂我們的正常生活。所以實(shí)現(xiàn)一個(gè)對(duì)某些號(hào)碼(比如陌生號(hào)碼,指定號(hào)碼/黑名單等)進(jìn)行攔截以避免受到騷擾,是很有現(xiàn)實(shí)用途的。
為了避免程序過(guò)分復(fù)雜,造成不易學(xué)習(xí)的麻煩我在這里只實(shí)現(xiàn)“如果來(lái)電號(hào)碼沒(méi)在聯(lián)系人中,則進(jìn)行掛斷,并存入xml文件(SharedPreferences)中,并在首頁(yè)顯示”,以期達(dá)到拋磚引玉的效果。
其實(shí)在android在1.1版本后就已經(jīng)把Phone類的相關(guān)API給隱藏起來(lái)了,想要用代碼實(shí)現(xiàn)掛斷電話的功能,就必須通過(guò)AIDL才行,然后利用反射來(lái)使用其方法。
第一步:在程序中新建一個(gè)包,包名必須為:com.android.internal.telephony,因?yàn)橐褂胊idl。
第二步:在這個(gè)包里面新建一個(gè)名為ITelephony.aidl的文件,然后在文件里面寫(xiě)入代碼:
[java] view plaincopy
package com.android.internal.telephony;
interface ITelephony{
boolean endCall();
void answerRingingCall();
}
然后是要監(jiān)聽(tīng)電話狀態(tài),當(dāng)來(lái)電時(shí),檢測(cè)來(lái)電號(hào)碼是否符合攔截標(biāo)準(zhǔn)(這個(gè)攔截標(biāo)準(zhǔn)是我們自己定的,你可以攔截指定號(hào)碼如實(shí)現(xiàn)一個(gè)黑名單的功能,我們?cè)谶@里攔截所有不在聯(lián)系人里的號(hào)碼,并把此號(hào)碼存入文件,以方便在首頁(yè)顯示),代碼如下:
[java] view plaincopy
import java.lang.reflect.Method;
import java.util.ArrayList;
import com.android.internal.telephony.ITelephony;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneStatReceiver extends BroadcastReceiver{
String TAG = "tag";
TelephonyManager telMgr;
@Override
public void onReceive(Context context, Intent intent) {
telMgr = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
switch (telMgr.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.v(TAG,"number:"+number);
if (!getPhoneNum(context).contains(number)) {
SharedPreferences phonenumSP = context.getSharedPreferences("in_phone_num", Context.MODE_PRIVATE);
Editor editor = phonenumSP.edit();
editor.putString(number,number);
editor.commit();
endCall();
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
case TelephonyManager.CALL_STATE_IDLE:
break;
}
}
/**
* 掛斷電話
*/
private void endCall()
{
Class<TelephonyManager> c = TelephonyManager.class;
try
{
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = null;
Log.e(TAG, "End call.");
iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
iTelephony.endCall();
}
catch (Exception e)
{
Log.e(TAG, "Fail to answer ring call.", e);
}
}
private ArrayList<String>  getPhoneNum(Context context) {
ArrayList<String> numList = new ArrayList<String>();
//得到ContentResolver對(duì)象
ContentResolver cr = context.getContentResolver();
//取得電話本中開(kāi)始一項(xiàng)的光標(biāo)
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext())
{
// 取得聯(lián)系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
// 取得電話號(hào)碼(可能存在多個(gè)號(hào)碼)
while (phone.moveToNext())
{
String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
numList.add(strPhoneNumber);
Log.v("tag","strPhoneNumber:"+strPhoneNumber);
}
phone.close();
}
cursor.close();
return numList;
}
}
這里我們要注意以下幾點(diǎn):
1.PhoneStatReceiver一定要在清單文件(AndroidManifest.xml)中注冊(cè)。
2.一定要添加權(quán)限
AndroidManifest文件如下:
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxxx.xxxx"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<!-- 掛斷手機(jī)的權(quán)限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- 讀取手機(jī)狀態(tài)的權(quán)限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 讀content的權(quán)限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注冊(cè)監(jiān)聽(tīng)手機(jī)狀態(tài) -->
<receiver android:name=".PhoneStatReceiver">
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
</manifest>
其實(shí)最到這里,整個(gè)攔截功能就已經(jīng)實(shí)現(xiàn)了,但是呢,我們的首頁(yè)也不能讓它光禿禿的顯示個(gè)Hello World!吧。所以,在MainActivity中,再給大家加點(diǎn)料,就是在listView中顯示所有已經(jīng)被攔截的電話號(hào)碼,代碼如下:
[java] view plaincopy
import java.util.Map;
import android.app.ListActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences phonenumSP = getSharedPreferences("in_phone_num", Context.MODE_PRIVATE);
Map map = phonenumSP.getAll();
Object[] array = map.keySet().toArray();
Log.v("tag",map.toString()+map.size());
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,array);
setListAdapter(adapter);
}
}
好了,整個(gè)項(xiàng)目就完成了,我們可以攔截騷擾電話了,這只是一個(gè)小例子,你可以添加一些控制功能以更加人性化,比如開(kāi)啟和關(guān)閉攔截,可選的攔截時(shí)間段,給ListView添加點(diǎn)擊事件使用戶可以把攔截到的電話添加到通訊錄等功能。
不過(guò),這里只是完成了對(duì)來(lái)電的攔截功能,未對(duì)外撥電話進(jìn)行攔截,下篇博客再寫(xiě)吧!
參考:http://blog.163.com/wu_zefeng/blog/static/1826291752011312114420975/
http://www.cotrun.net/blog/1572.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android常用功能攔截短信電話
Android一些常用知識(shí)和代碼(不斷更新)
Android之Service實(shí)例電話監(jiān)聽(tīng)器
android?電話狀態(tài)的監(jiān)聽(tīng)
Service實(shí)例應(yīng)用之電話錄音
android代碼速查,常用一些基本功能實(shí)現(xiàn)方法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服