Android短信备份及数据插入实现代码解析

实现备份短信到xml文件和像短信中插入一条数据

一、实现短信将备份到xml文件中

在布局文件中定义一个按钮,定义点击事件为copyClick

MainActivity.java:

package com.lgqrlchinese.heima76android_copysms;

import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Xml;
import android.view.View;
import android.widget.Toast;

import org.xmlpull.v1.XmlSerializer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
  //动态获取权限
  static final String[] PERMISSION = new String[]{
      Manifest.permission.READ_SMS,
      Manifest.permission.WRITE_EXTERNAL_STORAGE,
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //动态获取权限
    MyPermission();
  }

  //点击按钮查询短信数据库内容,然后备份
  public void copyClick(View view) {

    try {
      //获取xml序列化实例
      XmlSerializer serializer = Xml.newSerializer();
      //设置序列化参数
      File file = new File(Environment.getExternalStorageDirectory().getPath(), "smsBackUp.xml");
      FileOutputStream fos = new FileOutputStream(file);
      serializer.setOutput(fos, "utf-8");
      //开始写xml文档的开头
      serializer.startDocument("utf-8", true);
      //开始写根节点
      serializer.startTag(null, "smss");

      //短信数据库内容也通过内容提供者暴露出来,所以我们只需要通过内容解析者去操作数据库
      Uri uri = Uri.parse("content://sms/");
      Cursor cursor = getContentResolver().query(uri, new String[]{"address", "date", "body"}, null, null, null);
      while (cursor.moveToNext()) {
        String address = cursor.getString(0);
        String date = cursor.getString(1);
        String body = cursor.getString(2);

        //写sms节点
        serializer.startTag(null, "sms");

        //写address节点
        serializer.startTag(null, "address");
        serializer.text(address);
        serializer.endTag(null, "address");

        //写body节点
        serializer.startTag(null, "body");
        serializer.text(body);
        serializer.endTag(null, "body");

        //写date节点
        serializer.startTag(null, "date");
        serializer.text(date);
        serializer.endTag(null, "date");

        serializer.endTag(null, "sms");

      }

      serializer.endTag(null, "smss");
      serializer.endDocument();

    } catch (FileNotFoundException e) {
      e.printStackTrace();
      System.out.println("异常1");
    } catch (IOException e) {
      e.printStackTrace();
      System.out.println("异常2");
    }

  }

  //动态获取权限
  public void MyPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
      //Android 6.0申请权限
      ActivityCompat.requestPermissions(this, PERMISSION, 1);
    } else {
      Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
    }
  }

}

当然权限是必要的

<uses-permission android:name="android.permission.READ_SMS"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

这样就在SD卡根目录备份了xml文件

在真机6.0测试中遇到存储address崩溃问题,调试好久。先打印addredss,没有问题;存储死数据没有问题,最后发现在输出打印室有个address为null。查看手机,是因为有个短信草稿,我想了两个都能想到的的解决办法:

1.删除或发送手机里的草稿

2.在代码中进行判断

if (address != null) {

          serializer.startTag(null, "address");
          serializer.text(address);
          serializer.endTag(null, "address");
        } else {
          serializer.text("这是草稿");
        }

二、向短信的数据库中插入数据(5.0及之后就不允许外部应用修改,直允许读取,不做过多记录)

import android.Manifest;
import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
  //动态获取权限
  static final String[] PERMISSION = new String[]{
      Manifest.permission.READ_SMS,
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyPermission();
  }

  //点击按钮在短信数据库插入数据
  public void insertClick(View view) {
    Uri uri = Uri.parse("ocntent://sms");
    ContentValues values = new ContentValues();
    values.put("address", "17865318803");
    values.put("body", "我是你的影子");
    values.put("date", System.currentTimeMillis());
    getContentResolver().insert(uri, values);
  }

  //动态获取权限
  public void MyPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
      //Android 6.0申请权限
      ActivityCompat.requestPermissions(this, PERMISSION, 1);
    } else {
      Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现短信验证功能

    本文实例为大家分享了Android实现短信验证功能的具体代码,供大家参考,具体内容如下 目标效果:   点金绑定手机号,输入手机号点击下一步,会收到一条验证码,验证码输入正确则提示验证成功,如果已经验证成功再次验证时,提示已经验证. 1.进入mob.com,注册账号,然后进入控制台,点击中间进入短信验证区. 2.点击左上角创建应用. 3.创建成功会显示应用的密钥,在初始化SDK中使用. 4.然后下载SDK. 5.下载后解压,SMSSDK文件夹中有如图两个项目,打开eclipse以Android项

  • Android实现自动填充短信验证码功能

    前言 短信验证码获取并自动填写现在已经成为一个人性化App的标配了,这篇文章将实现一个短信验证码获取并自动填写的demo.其实就是读取指定号码的短信并提取出验证码,然后赋值给EditText显示. demo效果图: 读取短信 Android系统在接受到一条短信的时候会发出一条Action为android.provider.Telephony.SMS_RECEIVED的有序广播,因此我们读取短信的验证码只需要监听这个广播然后提取出短信中的验证码即可,如: /** * Created by 程龙 o

  • Android实现页面短信验证功能

    本文实例为大家分享了Android实现页面短信验证功能的具体代码,供大家参考,具体内容如下 目标效果: 上一篇博文介绍的是使用SDK中自带的验证页面,需要进行多次跳转,并且项目需要添加两个框架,多有不便,这个例子简化了短信验证的代码,但是不足的是功能不如原本那个完善. 1.新建项目,找到上一次下载的SDK文件中包含的SMSSDK项目,复制lib目录下的三个jar包,res目录下的raw文件夹和values目录下的两个xml文件到本项目. 2.activity_main.xml页面设置布局. ac

  • Android自定义控件实现短信验证码自动填充

    VerifyCodeView VerifyCodeView是一个用于输入验证码的Android自定义控件,它支持数字类型的验证码,支持自定义外观,并且支持短信验证码自动填充. 项目地址:VerifyCodeView 在项目中引入VerifyCodeView Gradle dependencies { compile 'com.github.gongw:verifycodeview:1.0.2' } Maven <dependency> <groupId>com.github.gon

  • Android 如何使用短信链接打开APP

    短信链接跳转APP 平时我们会收到广告短信,比如某东,某宝,里面附加着链接,当你点开链接(手机自带的浏览器),发现浏览器打开后,等一下下,就会打开对应的APP,直接到广告相应的页面. Android端的代码 从简单的开始,第一个启动的Activity先来处理 <activity android:name=".activity.ActivityFirst"> <intent-filter> <action android:name="android

  • Android短信验证码监听解决onChange多次调用的方法

    先说一句:MIUI请放弃治疗!这里给个传送门: MIUI通知类短信权限的坑 识别短信验证码并提取还是挺常见的一个需求.所要解决的问题主要有: 1.如何监听 2.如何提取短信中的验证码 3.监听多次调用问题 直接看下面代码吧,很明了.需要注意的点有就是onChange会多次调用.其实打Log就看的出了,收到一条短信会调用两次onChange,Log结果如下: mUri===content://sms/raw/20 mUri===content://sms/inbox/20 安卓7.0以上系统,点击

  • Android BroadcastReceiver接收收到短信的广播

    一.知识介绍 1.broadcastReceiver是广播接受者,四大组件之一. 2.Android中内置了很多系统级别的广播,可以在应用程序中得到各种系统的状态信息. 3.使用场景: ①当手机没有电时,会告知用户"电量低"的广播信息.可以做到正在使用的app就会接收到这个广播消息,如果是游戏可能是提醒保存数据,如果是正在使用的工作软件,可能提醒接上电源. [提示]对于某某程序来说,可以选择接收这一消息也可以选择不接收这个消息. ②手机的storage不够了,提示你清理空间,否则应用程

  • Android MIUI通知类短信权限的坑

    MIUI的坑爹设计还真不少.比如说,MIUI手机不插SIM卡就不能USB调试安装应用,好,插,结果又让你先登录小米账号(无话可说).MIUI权限申请也是坑! 就拿READ_SMS这个权限来说,按照安卓规范来动态申请,它不弹窗让用户允许,然后回调却是成功的,到设置里一看,该权限还是询问状态.这什么逻辑啊! 然后想实现自动填短信验证码,不好意识,我MIUI自定义了一个通知类短信权限(Service_SMS),你不知道怎么申请,也不知道怎么在manifest注册.所以你没有权,也限监听不到的.我也不知

  • Android8.1 通过黑名单屏蔽系统短信和来电功能

    前言 同样的最近有个新需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制,那就开始吧. 屏蔽短信功能 还可沿用之前的6.0 处理方法, 在 SmsReceiverService.java 中 handleSmsReceived()中进行拦截分发 但是想了想这次准备搞点不一样的,我发现通讯录和之前6.0不太一样,8.1有个添加屏蔽联系人的功能,能够屏蔽指定电话和短信,也就是黑名单功能.所以此次就通过黑名单的方式进行拦截,通过下面几位老哥的详尽分析和打印日志找到修改地方 源码

  • Android短信备份及数据插入实现代码解析

    实现备份短信到xml文件和像短信中插入一条数据 一.实现短信将备份到xml文件中 在布局文件中定义一个按钮,定义点击事件为copyClick MainActivity.java: package com.lgqrlchinese.heima76android_copysms; import android.Manifest; import android.content.pm.PackageManager; import android.database.Cursor; import andro

  • Android短信操作常见协议和常用代码

    content://sms/inbox 收件箱 content://sms/sent 已发送 content://sms/draft 草稿 content://sms/outbox 发件箱 content://sms/failed 发送失败 content://sms/queued 待发送列表 sURLMatcher.addURI("sms", null, SMS_ALL); sURLMatcher.addURI("sms", "#", SMS_

  • android短信管理器SmsManager实例详解

    本文实例为大家分享了android短信管理器SmsManager的具体代码,供大家参考,具体内容如下 需要注册的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.SEND_SMS"/> 群发短信 package com.android.xiong.grou

  • Android实战教程第八篇之短信备份

    各种手机助手里面都包含了短信备份这一项.短信的本分主要包含四项:内容body.事件date.方式type.号码address. 短信备份~一.使用一种很笨的方式来保存短信到xml文件中,而且保存在外部存储.后续会有:短信备份~二(xml序列化器):短信备份~三(内容提供者获取短信xml备份):短信备份~四(json方式备份数据库短信).备份的方式越来越高效,比较不同存储方式. 很显然,初次介绍短信备份,以一种简单笨拙的方式,且不涉及内容提供者,虚拟10条短信. 短信的保存,要以对象的形式保存.因

  • Android实现支持进度条显示的短信备份工具类

    使用内容提供者读取短信内容,写入XML文件,进度条ProgressDialog更新备份进度. 新知识点:子线程如何在在不使用Handler的情况下更新UI /** * 进行短信备份的工具类,支持进度条显示 * @author lian * */ public class SmsBackupUtils { private static class Data{ int progress; } /** * * @param context * 调用此工具类的Activity * @param pd *

  • Android短信验证服务分享

    本文实例为大家分享了Android短信验证服务的具体代码,供大家参考,具体内容如下 package com.skiers.demo_learn; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.widget.EditText; import androi

  • OpenHarmony实现类Android短信验证码及倒计时流程详解

    目录 1.背景 2.效果预览 3.思路 4.创建应用 5.删除原有代码 6.编写代码实现功能 1.布局拆分 2.实现堆叠布局 3.实现文本展示 4.实现输入框 5.实现短信验证码按钮 6.定时器的实现 7.签名及真机调试 8.源码地址 9.总结 1.背景 倒计时的效果在网站或其他平台看到的很多了吧,今天就让我们来看看在OpenHarmony中如何实现它吧! 2.效果预览 视频效果演示 传送门 开发板:DAYU200 IDE:DevEco Studio 3.0 Release Build Vers

  • Android 短信转换成彩信的消息数量(实例代码)

    默认3条以上转为彩信 改为5条 路径vendor/mediatek/proprietary/packages/apps/Mms/src/com/android/mms/MmsConfig.java private static int sSmsToMmsTextThreshold = 6; // 4 变量定义字面意思就可以理解 以下是代码分析 vendor/mediatek/proprietary/packages/apps/Mms/res/layout/compose_message_acti

  • 详解Android短信的发送和广播接收实现短信的监听

    本文介绍了Android短信的发送和广播接收者实现短信的监听,要注意Android清单中权限的设置以及广播的注册监听实现,废话不多说,代码如下: 以下就是 Android清单的XML AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zyw.broadcastsendsms" android:versionC

  • Android 短信验证码自动填写

    Android 短信验证码自动填写 1.自定义Observer监听短信数据库变化(注意添加短信权限) import android.app.Activity; import android.content.ContentResolver; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import

随机推荐