編輯:關於Android編程
本實例允許用戶動態添加號碼到黑名單,並實現黑名單來電自動掛斷。程序通過創建PhoneStateListener監聽器來監聽TelephonyManager的通話狀態來實現該功能。
由於自Android 10之後Android不再對外公開掛斷電話的API,如果需要掛斷電話必須使用AIDL與電話管理Service進行通信,並調用服務中的API實現結束電話。
為了調用遠程的AIDL Service,開發者需要將Android源碼中的如下兩個文拷到指定位置:
com.android.internal.telephony包下的ITelephony.aidl
android.telephony包下的NeighboringCellInfo.aidl
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLR+b7Nu+HU2mdlbs7EvP680M/Cyfqzyc/g06a1xC5KYXZhzsS8/qGjPC9wPgo8cD7B7c3itffTw0FQSbXEt723qMjnufvT0LK7veK1xLXYt72/ydLUss6/vKO6Q2xhc3MuZm9yTmFtZSgptcTX99PD0+vKudPD19y94TwvcD4KPHA+we3N4rG+yrXA/cq508NCYXNlQWRhcHRlctf3zqpMaXN0Vmlld7XEysrF5Mb3o6xCYXNlQWRhcHRlcr7f09C63Me/tcS2qNbG0M2hozwvcD4KPHA+0d3Kvs28xqyjujwvcD4KPGhyPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140726/20140726091337155.gif" alt="\">
程序代碼:
package com.jph.callguard; import java.lang.reflect.Method; import java.util.ArrayList; import com.android.internal.telephony.ITelephony; import android.os.Bundle; import android.os.IBinder; import android.provider.ContactsContract; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.ListView; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.database.Cursor; /** * Describe: * 黑名單自動掛斷 * 本實例實現了獲取聯系人,並將選中的聯系人添加到黑名單中 * 並通過ITelephony.aidl與NeighboringCellInfo.aidl * 接口使用AIDL與電話管理Servic進行通信掛斷黑名單中的電話 * @author jph * Time:2014.07.24 * */ public class CallGuard extends Activity { Button btnManage; TelephonyManager tManager; //創建一個集合用於保存黑名單中的號碼 ArrayListblockList=new ArrayList (); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnManage=(Button)findViewById(R.id.btnManage); tManager=(TelephonyManager) getSystemService(TELEPHONY_SERVICE); //創建電話狀態監聽器 PhoneStateListener pStateListener=new PhoneStateListener(){ @Override public void onCallStateChanged(int state, String incomingNumber) { // TODO Auto-generated method stub switch (state) { case TelephonyManager.CALL_STATE_IDLE://空閒狀態不做處理 break; case TelephonyManager.CALL_STATE_OFFHOOK://接起電話不做處理 break; case TelephonyManager.CALL_STATE_RINGING://正在響鈴 //如果來電號碼在黑名單中則自動掛斷 if (isBlock(incomingNumber)) { try { //獲取android.os.ServiceManager類的對象的getService()方法 Method method=Class.forName("android.os.ServiceManager"). getMethod("getService",String.class); // 獲取遠程TELEPHONY_SERVICE的IBinder對象的代理 IBinder binder =(IBinder)method.invoke(null, new Object[] {TELEPHONY_SERVICE}); // 將IBinder對象的代理轉換為ITelephony對象 ITelephony telephony=ITelephony.Stub.asInterface(binder); //掛斷電話 telephony.endCall(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } break; } super.onCallStateChanged(state, incomingNumber); } }; //為TelephonyManager添加監聽器 tManager.listen(pStateListener, PhoneStateListener.LISTEN_CALL_STATE); btnManage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //查詢通信錄中的電話號碼 final Cursor cursor=getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); //創建一個BaseAdapter作為ListView的適配器 BaseAdapter adapter=new BaseAdapter() { @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub //將游標的指針移動到指定位置 cursor.moveToPosition(position); CheckBox box=new CheckBox(CallGuard.this); //獲取指定位置的電話號碼 String number=cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); //去掉電話號碼中間的中劃線、空格 number.replace("-", "").replace(" ", ""); box.setText(number); //如果該號碼已經被加入黑名單、默認勾選該號碼 if (isBlock(number)) { box.setChecked(true); } return box; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } //返回列表的總條數 @Override public int getCount() { // TODO Auto-generated method stub return cursor.getCount(); } }; //加載line布局文件 View view=getLayoutInflater().inflate(R.layout.line, null); //獲取line布局文件中Id為list的組件 final ListView list=(ListView)view.findViewById(R.id.list); list.setAdapter(adapter); new AlertDialog.Builder(CallGuard.this).setView(view).setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub blockList.clear(); for (int i = 0; i < list.getCount(); i++) { CheckBox box=(CheckBox)list.getChildAt(i); //如果聯系人被選中則將其添加到blockList集合 if (box.isChecked()) { blockList.add(box.getText().toString()); } } } }).show(); } }); } private boolean isBlock(String number) { // TODO Auto-generated method stub //判斷號碼是否在blockList集合中 for (String s:blockList) { if (s.equals(number)) { return true; } } return false; } }
AndroidManifest.xml
關於android中ImageView的外觀,即圖片在其內顯示出的樣子,與布局文件中adjustViewBonds和scaleType 屬性的關系。我進行了一些探索。現
一.申請密鑰登陸百度開放平台,選擇創建應用,輸入應用名稱,選擇AndroidSDK、發布版SHA1值和包名 獲取sha1值– 使用AndroidStudio獲
我們在手機上查看相冊時,首先看到的是網格狀的圖片展示界面,然後我們選擇想要欣賞的照片點擊進入,這樣就可以全屏觀看該照片,並且可以通過左右滑動來切換照片。如下圖的顯示效果:
假設我們現在有這麼一個需求,就是自定義一個組件,該組件由一個小圖標和圖標的文字說明組成,並且帶有背景色,背景色可設置,寬度高度可設置。如下圖所示正是兩個這樣的組件所組成。