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
持续更新中。。。。。。。。。。。。