編輯:關於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
anroid scaleType屬性對應的效果
關於android中ImageView的外觀,即圖片在其內顯示出的樣子,與布局文件中adjustViewBonds和scaleType 屬性的關系。我進行了一些探索。現
Android 百度地圖sdk集成
一.申請密鑰登陸百度開放平台,選擇創建應用,輸入應用名稱,選擇AndroidSDK、發布版SHA1值和包名 獲取sha1值– 使用AndroidStudio獲
Android中使用GridView和ImageViewSwitcher實現電子相冊簡單功能實例
我們在手機上查看相冊時,首先看到的是網格狀的圖片展示界面,然後我們選擇想要欣賞的照片點擊進入,這樣就可以全屏觀看該照片,並且可以通過左右滑動來切換照片。如下圖的顯示效果:
Android React Native自定義組件的流程
假設我們現在有這麼一個需求,就是自定義一個組件,該組件由一個小圖標和圖標的文字說明組成,並且帶有背景色,背景色可設置,寬度高度可設置。如下圖所示正是兩個這樣的組件所組成。