转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72880361
1.Android源码在线浏览
http://grepcode.com/ —-Android框架代码http://androidxref.com/ —-完整的源码环境
2.挂断电话
<uses-permission android:name=
"android.permission.CALL_PHONE" />
/**
* 挂断电话
*/
public void endCall() {
try {
Class clazz = getClassLoader().loadClass(
"android.os.ServiceManager");
Method method = clazz.getDeclaredMethod(
"getService", String.class);
IBinder iBinder = (IBinder) method.invoke(
null, Context.TELEPHONY_SERVICE);
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();
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.导入已存在的数据库
/**
* 拷贝归属地的数据库
*/
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() {
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() {
@Override
public void beforeTextChanged(CharSequence s,
int start,
int count,
int after) {
}
@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);
}
}
@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);