发送手机短信

// 发送短信给安全号码
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phone, null,"sim card changed!", null, null);

设置接受广播的优先级最高也就是inter里面的最大值。你可以看api,然后转化为十进制。应该是这个 2147483647。

<receiver android:name=".receiver.SmsReceiver" >
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

播放一些小聲音

// 播放报警音乐, 即使手机调为静音,也能播放音乐, 因为使用的是媒体声音的通道,和铃声无关
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);
player.setVolume(1f, 1f);
player.setLooping(true);
player.start();

短信的广播接受者

package com.itheima52.mobilesafe.receiver;

import com.itheima52.mobilesafe.R;
import com.itheima52.mobilesafe.service.LocationService; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.sax.StartElementListener;
import android.telephony.SmsMessage; /**
* 拦截短信
*
* @author Kevin
*
*/
public class SmsReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Object[] objects = (Object[]) intent.getExtras().get("pdus"); for (Object object : objects) {// 短信最多140字节,
// 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
String originatingAddress = message.getOriginatingAddress();// 短信来源号码
String messageBody = message.getMessageBody();// 短信内容 System.out.println(originatingAddress + ":" + messageBody); if ("#*alarm*#".equals(messageBody)) {
// 播放报警音乐, 即使手机调为静音,也能播放音乐, 因为使用的是媒体声音的通道,和铃声无关
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);
player.setVolume(1f, 1f);
player.setLooping(true);
player.start(); abortBroadcast();// 中断短信的传递, 从而系统短信app就收不到内容了
} else if ("#*location*#".equals(messageBody)) {
// 获取经纬度坐标
context.startService(new Intent(context, LocationService.class));// 开启定位服务 SharedPreferences sp = context.getSharedPreferences("config",
Context.MODE_PRIVATE);
String location = sp.getString("location",
"getting location..."); System.out.println("location:" + location); abortBroadcast();// 中断短信的传递, 从而系统短信app就收不到内容了
} else if ("#*wipedata*#".equals(messageBody)) {
System.out.println("远程清除数据");
abortBroadcast();
} else if ("#*lockscreen*#".equals(messageBody)) {
System.out.println("远程锁屏");
abortBroadcast();
}
}
} }

手机定位

package com.itheima52.location;

import java.util.List;

import android.app.Activity;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView; public class MainActivity extends Activity { private TextView tvLocation;
private LocationManager lm;
private MyLocationListener listener; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tvLocation = (TextView) findViewById(R.id.tv_location); lm = (LocationManager) getSystemService(LOCATION_SERVICE);
List<String> allProviders = lm.getAllProviders();// 获取所有位置提供者
System.out.println(allProviders); listener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);// 参1表示位置提供者,参2表示最短更新时间,参3表示最短更新距离
} class MyLocationListener implements LocationListener { // 位置发生变化
@Override
public void onLocationChanged(Location location) {
String j = "经度:" + location.getLongitude();
String w = "纬度:" + location.getLatitude();
String accuracy = "精确度:" + location.getAccuracy();
String altitude = "海拔:" + location.getAltitude(); tvLocation
.setText(j + "\n" + w + "\n" + accuracy + "\n" + altitude);
} // 位置提供者状态发生变化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("onStatusChanged");
} // 用户打开gps
@Override
public void onProviderEnabled(String provider) {
System.out.println("onProviderEnabled");
} // 用户关闭gps
@Override
public void onProviderDisabled(String provider) {
System.out.println("onProviderDisabled");
} } @Override
protected void onDestroy() {
super.onDestroy();
lm.removeUpdates(listener);// 当activity销毁时,停止更新位置, 节省电量
} }

选择最优定位定位

package com.itheima52.mobilesafe.service;

import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder; /**
* 获取经纬度坐标的service
*
* @author Kevin
*
*/
public class LocationService extends Service { private LocationManager lm;
private MyLocationListener listener;
private SharedPreferences mPref; @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate(); mPref = getSharedPreferences("config", MODE_PRIVATE); lm = (LocationManager) getSystemService(LOCATION_SERVICE);
// List<String> allProviders = lm.getAllProviders();// 获取所有位置提供者
// System.out.println(allProviders); Criteria criteria = new Criteria();
criteria.setCostAllowed(true);// 是否允许付费,比如使用3g网络定位
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String bestProvider = lm.getBestProvider(criteria, true);// 获取最佳位置提供者 listener = new MyLocationListener();
lm.requestLocationUpdates(bestProvider, 0, 0, listener);// 参1表示位置提供者,参2表示最短更新时间,参3表示最短更新距离
} class MyLocationListener implements LocationListener { // 位置发生变化
@Override
public void onLocationChanged(Location location) {
System.out.println("get location!"); // 将获取的经纬度保存在sp中
mPref.edit()
.putString(
"location",
"j:" + location.getLongitude() + "; w:"
+ location.getLatitude()).commit(); stopSelf();//停掉service
} // 位置提供者状态发生变化
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("onStatusChanged");
} // 用户打开gps
@Override
public void onProviderEnabled(String provider) {
System.out.println("onProviderEnabled");
} // 用户关闭gps
@Override
public void onProviderDisabled(String provider) {
System.out.println("onProviderDisabled");
} } @Override
public void onDestroy() {
super.onDestroy();
lm.removeUpdates(listener);// 当activity销毁时,停止更新位置, 节省电量
} }

监听输入框文字变化

// 监听EditText的变化
etNumber.addTextChangedListener(new TextWatcher() { // 文字 发生变化时的回调
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String address = AddressDao.getAddress(s.toString());
tvResult.setText(address);
} // 文字变化前的回调
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) { } // 文字变化结束之后的回调
@Override
public void afterTextChanged(Editable s) { }
});

访问已经有的数据库

package com.itheima52.mobilesafe.db.dao;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; /**
* 归属地查询工具
*
* @author Kevin
*
*/
public class AddressDao { private static final String PATH = "data/data/com.itheima52.mobilesafe/files/address.db";// 注意,该路径必须是data/data目录的文件,否则数据库访问不到 public static String getAddress(String number) {
String address = "未知号码"; // 获取数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null,
SQLiteDatabase.OPEN_READONLY); // 手机号码特点: 1 + (3,4,5,6,7,8) + (9位数字)
// 正则表达式
// ^1[3-8]\d{9}$ if (number.matches("^1[3-8]\\d{9}$")) {// 匹配手机号码
Cursor cursor = database
.rawQuery(
"select location from data2 where id=(select outkey from data1 where id=?)",
new String[] { number.substring(0, 7) }); if (cursor.moveToNext()) {
address = cursor.getString(0);
} cursor.close();
} else if (number.matches("^\\d+$")) {// 匹配数字
switch (number.length()) {
case 3:
address = "报警电话";
break;
case 4:
address = "模拟器";
break;
case 5:
address = "客服电话";
break;
case 7:
case 8:
address = "本地电话";
break;
default:
// 01088881234
// 048388888888
if (number.startsWith("0") && number.length() > 10) {// 有可能是长途电话
// 有些区号是4位,有些区号是3位(包括0) // 先查询4位区号
Cursor cursor = database.rawQuery(
"select location from data2 where area =?",
new String[] { number.substring(1, 4) }); if (cursor.moveToNext()) {
address = cursor.getString(0);
} else {
cursor.close(); // 查询3位区号
cursor = database.rawQuery(
"select location from data2 where area =?",
new String[] { number.substring(1, 3) }); if (cursor.moveToNext()) {
address = cursor.getString(0);
} cursor.close();
}
}
break;
}
} database.close();// 关闭数据库
return address;
}
}

振动器

/**
* 手机震动, 需要权限 android.permission.VIBRATE
*/
private void vibrate() {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
// vibrator.vibrate(2000);震动两秒
vibrator.vibrate(new long[] { 1000, 2000, 1000, 3000 }, -1);// 先等待1秒,再震动2秒,再等待1秒,再震动3秒,
// 参2等于-1表示只执行一次,不循环,
// 参2等于0表示从头循环,
// 参2表示从第几个位置开始循环
// 取消震动vibrator.cancel()
}

接受来电做一些事情

package com.itheima52.mobilesafe.service;

import com.itheima52.mobilesafe.R;
import com.itheima52.mobilesafe.db.dao.AddressDao; import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast; /**
* 来电提醒的服务
*
* @author Kevin
*
*/
public class AddressService extends Service { private TelephonyManager tm;
private MyListener listener;
private OutCallReceiver receiver;
private WindowManager mWM;
private View view;
private SharedPreferences mPref; @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate(); mPref = getSharedPreferences("config", MODE_PRIVATE); tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);// 监听来电的状态 receiver = new OutCallReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(receiver, filter);// 动态注册广播
} class MyListener extends PhoneStateListener { @Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 电话铃声响了
System.out.println("电话铃响...");
String address = AddressDao.getAddress(incomingNumber);// 根据来电号码查询归属地
// Toast.makeText(AddressService.this, address,
// Toast.LENGTH_LONG)
// .show();
showToast(address);
break; case TelephonyManager.CALL_STATE_IDLE:// 电话闲置状态
if (mWM != null && view != null) {
mWM.removeView(view);// 从window中移除view
view = null;
}
break;
default:
break;
} super.onCallStateChanged(state, incomingNumber);
} } /**
* 监听去电的广播接受者 需要权限: android.permission.PROCESS_OUTGOING_CALLS
*
* @author Kevin
*
*/
class OutCallReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
String number = getResultData();// 获取去电电话号码 String address = AddressDao.getAddress(number);
// Toast.makeText(context, address, Toast.LENGTH_LONG).show();
showToast(address);
}
} @Override
public void onDestroy() {
super.onDestroy();
tm.listen(listener, PhoneStateListener.LISTEN_NONE);// 停止来电监听 unregisterReceiver(receiver);// 注销广播
} /**
* 自定义归属地浮窗
*/
private void showToast(String text) {
mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams();
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;
params.setTitle("Toast"); // view = new TextView(this);
view = View.inflate(this, R.layout.toast_address, null); int[] bgs = new int[] { R.drawable.call_locate_white,
R.drawable.call_locate_orange, R.drawable.call_locate_blue,
R.drawable.call_locate_gray, R.drawable.call_locate_green };
int style = mPref.getInt("address_style", 0); view.setBackgroundResource(bgs[style]);// 根据存储的样式更新背景 TextView tvText = (TextView) view.findViewById(R.id.tv_number);
tvText.setText(text); mWM.addView(view, params);// 将view添加在屏幕上(Window)
} }
//获取到rom内存的运行的剩余空间
long rom_freeSpace = Environment.getDataDirectory().getFreeSpace();
//获取到SD卡的剩余空间
long sd_freeSpace = Environment.getExternalStorageDirectory().getFreeSpace(); System.out.println("内存可用:" + rom_freeSpace); System.out.println("sd卡可用:" + sd_freeSpace); //格式化大小
tv_rom.setText("内存可用:" + Formatter.formatFileSize(this, rom_freeSpace));
tv_sd.setText("sd卡可用" + Formatter.formatFileSize(this, sd_freeSpace));

文本复制到剪切板

@SuppressWarnings("deprecation")
public static void copyTextToBoard(String string) {
if (TextUtils.isEmpty(string))
return;
ClipboardManager clip = (ClipboardManager) BaseApplication.context()
.getSystemService(Context.CLIPBOARD_SERVICE);
clip.setText(string);
AppContext.showToast(R.string.copy_success);
}

常用的一些api的更多相关文章

  1. Func常用模块及API

    Func常用模块及API Func提供了非常丰富的功能模块,包括: CommandModule(执行命令) CopyFileModule(拷贝文件) CpuModule(CPU信息) DiskModu ...

  2. 常用的百度API地图操作

    常用的百度API地图操作,包括模糊搜索,放大缩小,并支持移动端 效果图如下 完整代码: http://download.csdn.net/detail/jine515073/8778167

  3. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  4. Vue3:不常用的Composition API && Fragment、Teleport、Suspense && 与Vue2对比的一些变化

    1 # 一.Vue3不常用的Composition API 2 # 1.shallowReactive与shallowRef 3 .shallowReactive: 只处理对象最外层属性的响应式(浅响 ...

  5. Saltstack常用模块及API

    Saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能.常用工具支持等,更多模块信息可以查看官网模块介绍.也可以通过sys模块列出当前版本支持的模块. salt '*' sys.list_ ...

  6. Func系列2:常用模块及API

    简介 Func提供了非常丰富的功能模块,包括CommandModule(执行命令).CopyFileModule(拷贝文件).CPUModule(CPU信息).DiskModule(磁盘信息).Fil ...

  7. Saltstack系列3:Saltstack常用模块及API

    说明 salt '*' sys.list_modules #列出当前版本支持的模块 API原理是通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现 ...

  8. Ansible常用模块及API

    Ansible安装 安装EPEL作为安装Ansible的yum源(CentOS6.4): rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel ...

  9. 常用Vxworks编程API

    vxWorks编程API 一.官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二.常用的库: #i nclude "taskL ...

  10. Js 常用字符串操作 API

    常用的一些字符串操作 API 整理 1.str.charAt(index).str.charCodeAt(index) - 返回指定位置的字符 / 字符编码(0~65535) index - 必须,表 ...

随机推荐

  1. 第2章 TCP-IP的工作方式

    第2章 TCP-IP的工作方式 TCP/IP协议系统 为了实现TCP的功能,TCP/IP的创建者使用了模块化的设计.TCP/IP协议系统被分为不同的组件,每个组件分别负责通信过程的一个步骤.这种模块化 ...

  2. 工控图表控件ProEssentials创建3D柱状图示例代码

    使用ProEssentials可以创建3D柱状图,柱状图的形式包括线框.实体和阴影. 类似于Graph control,3D柱状图只需要YData. Subsets定义沿z轴有多少行,Points定义 ...

  3. SHOW SLAVE STATUS 详解

    MySQL同步功能由3个线程(master上1个,slave上2个)来实现.执行 DE>START SLAVEDE> 语句后,slave就创建一个I/O线程.I/O线程连接到master上 ...

  4. 远程登录事件ID

    4672.4624 删除本机记录 HKEY_CURRENT_USER \ Software\Microsoft  \ Terminal ServerClientDefault: 删除“此电脑\文档”下 ...

  5. 关于mongodb的日志

    mongodb的日志与profile相似,在启动mongod时 可以用verbose这个参数配置他的日志详细程度,分为一个v到5个v,其中v越多,详细度越高   mogod.conf port = d ...

  6. 3203 数组做函数参数----排序函数--C语言版

    3203: 数组做函数参数----排序函数--C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 253  解决: 151[提交][状态][讨论版][命题人:smallgyy] 题目描 ...

  7. 2018.6.10 Oracle数据库常见的错误汇总

    1.ClassNoFoundException 找不到注册驱动 可能原因:1>驱动名称不对 2>没有导入数据库驱动包 2.SQl 语句中可以使用任何有效的函数,函数操作的列,必须指定别名, ...

  8. window下安装ubuntu(ubuntu可删除)

    进入ububtu13.04的安装界面,这里我们选择了“中文(简体)”,然后单击安装: 下图是现场拍的:   出现如下图时,请根据需要选择,然后单击“继续” , 接下来会出现问你是否要连接网络,我们选择 ...

  9. python 多进程简单调用

    python 多进程简 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/28 10:03 # so ...

  10. Angular6中[ngClass]、[ngStyle]的基本使用

    1.ngStyle 基本用法 <div [ngStyle]="{'background-color':'green'}"></<div> 判断添加 & ...