Android监听手机短信的方法有两种,分别为:
1、接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容;
2、监听短信数据库:利用观察者模式监听短信数据库,当短信数据库改变时就可以触发观察者模式的onChange()方法;
具体实现代码可见:
android开发中两种方式监听短信的原理和实现
注意事项: 读取手机短信需要读取手机短信的权限,首先要在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
由于读取手机短信属于危险权限,还需要在代码中动态请求用户授权,在MainActivity.java的onCreat()方法中添加如下代码
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.READ_SMS }, 1);
}
Android系统对所有的危险权限进行了分组,称为权限组 。属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得该权限组下的所有权限(前提是相关权限在 AndroidManifest.xml 中有声明),所有危险权限见下表:
编号 | 权限组 | 权限 |
---|---|---|
1 | CALENDAR (日历) | READ_CALENDAR WRITE_CALENDAR |
2 | CAMERA (相机) | CAMERA |
3 | CONTACTS (联系人) | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
4 | LOCATION (位置) | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
5 | MICROPHONE (麦克风) | RECORD_AUDIO |
6 | PHONE (手机) | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
7 | SENSORS (传感器) | BODY_SENSORS |
8 | SMS (短信) | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
9 | STORAGE (存储卡) | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
先在build.graddle中添加依赖项
添加完毕后记得点击sync now
在AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
代码中添加上传数据到数据库的代码,建议使用json来存储需要上传的数据
使用json构造requestbody,json中放什么数据可以根据需求决定
JSONObject obj = new JSONObject();
try {
obj.put("addressee",收件人);
obj.put("sender",发件人);
obj.put("data",短信内容);
obj.put("time",接收时间);
} catch (JSONException e) {
e.printStackTrace();
}
MediaType type = MediaType.parse("application/json;charset=utf-8");
RequestBody requestBody = RequestBody.create(type, obj.toString());
使用okhttp异步上传数据到后端
client = new OkHttpClient();
url = 后端接口;
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if(response.isSuccessful()){
String result = response.body().string();
Log.i(TAG, "onResponse: "+result);
开启Service实现锁屏监听
在Activity中监听短信,当应用被放入后台或者屏幕锁定一段时间后就无法继续将短信内容上传服务器,所以需要启动一个Service,在Service中监听短信,就可以在锁屏后继续监听短信。
要启动Service,首先需要在申请android.permission.FOREGROUND_SERVICE权限,该权限为普通权限,所以只要在AndroidManifest.xml中声明即可
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
之后还需要在AndroidManifest.xml中添加Service类对应的
android:name为pakagename+Service类名,pakagename可以省略;
android:enabled表示是否可以被系统实例化;
android:exported表示其它应用的组件是否可以唤醒service或者和这个service进行交互;
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"\>
Android8.0之后不再允许使用startService()启动服务,只能使用startForegroundService()启动服务,而且该服务必须是前台服务,具体启动方法可参考以下文章:
不需要与Service交互,使用startForegroundService()启动服务
需要与Service交互,使用bindService() 启动服务
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)