1 。 在黑名單電話的攔截和擦除通話記錄的過程中,曾經遇到的狀況:
endCall();
deleteCall_log();
無法成功刪除 content://call_log/calls 中的通話記錄。
原因:由於在 deleteCall_log(); 執行的時候,記錄還沒來得及寫入到call_log/calls (在文件的數據庫的路徑是:com.android.provider.contacts contacts2.db)表中,就將calllog表中不存在的通話記錄刪除掉,這肯定是不能執行成功的,而,在 deleteCall_log();操作執行完畢後,記錄才寫到calllog表。
綜上所述:deleteCall_log(); 與 向calllog表存記錄的 操作不同步。
解決方案:註冊一個內容監聽者(),代碼如下:
註冊觀察者:
Uri uri = Uri.parse("content://call_log/calls");
getContentResolver().registerContentObserver(uri, true, new CallLogContentObserver (new Handler(),incomingNumber));
創建觀察者
final class CallLogContentObserver extends ContentObserver {
String incomingNumber;
public CallLogContentObserver(Handler handler,String incomingNumber) {
super(handler);
this.incomingNumber = incomingNumber;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
deleteCallLog(incomingNumber);
//記得顯示的 解除 內容觀察者,否則 可能出現內存的泄漏
解除邦定觀察者
getContentResolver().unregisterContentObserver(this);
}
}
2.在activity中創建 dailog時,出現如下Bug:
The specified child already has a parent. You must call removeView() on the child's parent first
protect void onCreate (){
createDialog()
}
private void createDialog() {
Log.i(TAG, "createDialog()");
builder = new Builder(BlackListActivity.this);
builder.setTitle("黑名單添加");
ll_view = (LinearLayout) View.inflate(getApplicationContext(), R.layout.blacklist_dialog_view, null);
et_dialog_name = (EditText) ll_view.findViewById(R.id.et_dialog_name);
et_dialog_num = (EditText) ll_view.findViewById(R.id.et_dialog_num);
builder.setView(ll_view);
builder.setPositiveButton("添加", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//修改黑名單記錄
String>String>blackListService.add( name, num);
notifyAdapterWithData();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
notifyAdapterWithData();
}
});
builder.create();
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.tv_blackList_add){
show();//錯誤點
}
}
但是至今這個問題沒有真正明白,雖然檢查出來了bug產生的地方,嚮往高手指點,錯誤的原因
我個人的推測:在AlertDialog 第二次show();的時候,ll_view 直接放在了 activity加載的setContent(view)的組件上了,所以出錯了
3.自己創建的sqlite數據庫,只有在有數據的情況下,纔會創建的,否則不會創建
4.在開發這個 管理程序模塊的 時候,遇到如下bug:
PackageManager.GET_ACTIVITIES 開始的時候,我是沒寫的,這就意味着 找該包的時候,只有包信息,而沒有 該包的 所有的activity 的信息,所以,會出現找不到 String>
case R.id.ll_softmgr_popuwidow_start://運行程序
position = (Integer) ll_softmgr_popuwidow_uninstall.getTag();
packname = newSoftInfos.get(position).getPackname();
try {
//拿到指定包的 包信息
PackageInfo> | PackageManager.GET_ACTIVITIES);
//拿到指定包 的所有的activity的信息
ActivityInfo []>if(activityInfos != null && activityInfos.length > 0 ){
String>// Log.i(TAG, packname+" "+name);
Intent>startIntent.setClassName(packname, name);
startActivity(startIntent);
}else {
Toast.makeText(this, "無法啓動該程勳", 0).show();
}
} catch (NameNotFoundException e) {
Toast.makeText(this, "找不到相關的程序信息", 0).show();
e.printStackTrace();
}
break;
4.2 在創建popuwindow的時候,對其進行定位是,注意如下幾點:
4.2.1 一定要對 popuwindow 設置背景,即使是空的背景也要設(popu.setBackgroundDrawable(new ColorDrawable());)
popu.setBackgroundDrawable(new ColorDrawable());
popu.setWidth(220);
popu.setHeight(70);
popu.setFocusable(true);
4.2.1
int[]>view.getLocationInWindow(loc);//拿到itemview 在窗口的位置
popu.showAtLocation(view, Gravity.LEFT|Gravity.TOP, loc[0]+40, loc[1]);
5. 程序鎖模塊:
5.1 在自定義的 contentProvider 的過程中,產生如下bug:nullpointerexception;
public class AppLockContentProvider extends ContentProvider {
private AppLockInfoService appLockInfoService = new AppLockInfoService(getContext());
@Override
public Uri insert(Uri uri, ContentValues values) {
if(matcher.match(uri) == INSERT){
String packname = values.getAsString("packname");
appLockInfoService.add(packname);
getContext().getContentResolver().notifyChange(changeUri, null);
}else {
throw new IllegalArgumentException(uri+"不正確");
}
return null;
}
出現bug的原因:
contentprovider
持續更新中。。。。。。。。。。。。