Android实时监听短信并上传服务器

Android实时监听短信并上传服务器,第1张

短信监听

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 中有声明),所有危险权限见下表:

编号权限组权限
1CALENDAR (日历)READ_CALENDAR
WRITE_CALENDAR
2CAMERA (相机)CAMERA
3CONTACTS (联系人)READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
4LOCATION (位置)ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
5MICROPHONE (麦克风)RECORD_AUDIO
6PHONE (手机)READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
7SENSORS (传感器)BODY_SENSORS
8SMS (短信)SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
9STORAGE (存储卡)READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
使用okhttp上传短信到服务器

先在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() 启动服务

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存