android項目——手機衛士_遇到的問題

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

持續更新中。。。。。。。。。。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章