Android - 在线浏览源码,电话短信相关,文本变化监听器,Interpolator,WindowManager
2017-06-06 15:28
573 查看
1.Android源码在线浏览
http://grepcode.com/ —-Android框架代码http://androidxref.com/ —-完整的源码环境
2.挂断电话
//加入权限 <uses-permission android:name="android.permission.CALL_PHONE" /> /** * 挂断电话 */ public void endCall() { //系统内部调用方式 //ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); try { //ServiceManager获取不到,需要反射调用 Class clazz = getClassLoader().loadClass("android.os.ServiceManager"); Method method = clazz.getDeclaredMethod("getService", String.class); IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE); //挂断电话需要用到AIDL,拷贝需要用到的AIDL文件,ITelephony.aidl和NeighboringCellInfo.aidl,包名要与原包名一致 ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder); iTelephony.endCall(); } catch (Exception e) { e.printStackTrace(); } }
3.删除呼叫记录
//加入权限 <uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> /** * 删除黑名单号码的呼叫记录 * @param incomingNumber 来电黑名单号码 */ public void deleteCallLog(final String incomingNumber) { final ContentResolver resolver = getContentResolver(); //CallLog.Calls.CONTENT_URI 等价于 Uri.parse("content://call_log/calls"); final Uri uri = Uri.parse("content://call_log/calls"); //利用内容观察者 观察呼叫记录的数据库,如果生成了呼叫记录就立刻删除呼叫记录 resolver.registerContentObserver(uri, true, new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { //当内容观察者观察到数据库的内容变化的时候调用的方法. super.onChange(selfChange); resolver.delete(uri, "number=?", new String[]{incomingNumber}); } }); }
4.拦截短信
1.注册在清单文件中的广播接收者,无论应用是否启动都会接收到广播,想用开关控制拦截短信的功能,则在代码中注册短信广播接收者 receiver = new InnerSmsReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); registerReceiver(receiver, filter); private class InnerSmsReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.i(Tag,"服务内部广播接受者接收到了短信"); Object[] objs = (Object[]) intent.getExtras().get("pdus"); for(Object obj: objs){ SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj); String body = smsMessage.getMessageBody(); if(body.contains("fapiao")){ //你的头发票亮的很 分词技术 Log.i(Tag,"发现发票垃圾短信,拦截"); abortBroadcast(); return; } String sender = smsMessage.getOriginatingAddress(); String mode = dao.find(sender); if("2".equals(mode)||"3".equals(mode)){ Log.i(Tag,"发现黑名单短信,拦截"); abortBroadcast(); } } } } 2.onDestroy中注销 unregisterReceiver(receiver); receiver = null;
5.导入已存在的数据库
//assert资产目录里面的文件会原封不动的打包到apk里,不生成id /** * 拷贝归属地的数据库 */ private void copyAddressDB() { File file = new File(getFilesDir(), "address.db"); //判断数据库文件是否存在 if (file.exists() && file.length() > 0) { Log.i(TAG, "数据库存在,无需拷贝"); } else { new Thread() { public void run() { // 把asset资产目录里面的数据库文件(在apk里面的)拷贝到手机系统里面 try { InputStream is = getAssets().open("address.db"); File file = new File(getFilesDir(), "address.db"); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len = -1; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } fos.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } }; }.start(); } }
6.查询号码归属地
/** * 查询手机号码的归属地信息 * @param mobilenumber * @return */ public static String findLocation(String mobilenumber) { String path = "/data/data/com.mythmayor.project/files/address.db"; //打开已存在的数据库 SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); Cursor cursor = db.rawQuery( "select location from data2 where id = (select outkey from data1 where id = ?)", new String[]{mobilenumber.substring(0, 7)}); String location =""; if(cursor.moveToNext()){ location = cursor.getString(0); } cursor.close(); db.close(); return location; }
7.判断一个号码是否是手机号码
// ^1[34578]\d{9}$ // ^ 匹配输入字符串的开始位置。 // [] 字符集合。匹配所包含的任意一个字符。 // \d 匹配一个数字字符。 // {} n 是一个非负整数。匹配确定的 n 次。 // $ 匹配输入字符串的结束位置。 boolean result = number.matches("^1[34578]\\d{9}$");
8.给EditText添加文本变化监听器
// 给文本输入框注册一个内容变化的监听器. et_number.addTextChangedListener(new TextWatcher() { //当文本变化之前调用的方法,s为改变前字符串,可获取被替换内容 //在s中从start开始的count个字符即将被after个字符替换 @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } //当文本变化之后调用的方法,s为改变后字符串,可获取替换内容 //在s中从start开始的before个字符刚刚被count个字符替换 @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() >= 10) { String location = AddressDBDao.findLocation(s.toString()); tv_location.setText("归属地为:" + location); } } //当文本变化之后调用的方法,s为改变后字符串,操作s可直接改变EditText内容,EditText内容改变会继续调用beforeTextChanged和onTextChanged方法 //s中有内容被改变 @Override public void afterTextChanged(Editable s) { } }); 每次输入都会调用3个方法,调用顺序为beforeTextChanged-->onTextChanged-->afterTextChanged
9.CharSequence、String、Editable
1.CharSequence:接口,只有length()、charAt(int index)、subSequence(int start, int end)、toString()四个方法 2.String:实现了CharSequence接口,具有很多操作字符串的方法,不可修改 3.Editable:实现了CharSequence接口,具有增删改等修改的方法,可修改
10.动画插值器Interpolator
1.interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。 2.常用Interpolator LinearInterpolator 以常量速率改变 AccelerateInterpolator 加速 DecelerateInterpolator 减速 AccelerateDecelerateInterpolator 先加速后减速 AnticipateInterpolator OvershootInterpolator AnticipateOvershootInterpolator BounceInterpolator 弹跳 CycleInterpolator 循环播放特定的次数,速率改变沿着正弦曲线
11.监听外拨电话
1.添加权限 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 2.注册广播接收者 receiver = new OutCallReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL); registerReceiver(receiver, filter); private class OutCallReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String number = getResultData(); String address = AddressDBDao.findLocation(number); Toast.makeText(ShowAddressService.this, address, 1).show(); } } 3.释放资源 @Override public void onDestroy() { unregisterReceiver(receiver); receiver = null; super.onDestroy(); }
12.通过WindowManager添加自定义View到窗体
1.添加权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 2.获取WindowManager WindowManager mWM = (WindowManager) getSystemService(WINDOW_SERVICE); 3.自定义View View mView; 4.设置布局参数 final WindowManager.LayoutParams params = mParams; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_TOAST; 5.添加到窗体 mWM.addView(view, mParams); 6.移除View mWM.removeView(view);
相关文章推荐
- Android电话短信拦截项目总结之 项目源码及相关学习资料
- android手机短信监听器,监听到的短信发送到web服务器,完整源码分享
- 在线浏览android源码网站
- Android小项目之--电话与短信服务(附源码)
- android源码在线浏览网站
- 在线浏览android源码
- Android小项目之--电话与短信服务(附源码)
- 关于在线查看相关开源源码的网站,包括Android源码
- android源码在线浏览网站
- android源码在线浏览网站
- android在线源码浏览网站
- Android电话、短信相关
- android源码在线浏览网址
- Android小项目之--电话与短信服务(附源码)
- android之service实例电话监听器
- Android系列之二十-- 在eclipse中浏览Android源码
- 基于android系统的电话拨号跟短信发送
- Android短信搜索自动完成文本下拉列表
- FlexPaper实现文档在线浏览(附源码)
- (Android小应用)电话监听器