[上篇] React-Native 调用原生代码获取所以短信记录

本贴最后更新于 2187 天前,其中的信息可能已经斗转星移

本文由黑壳博客发布

本文来源 [上篇] React-Native 调用原生代码获取所以短信记录 - 黑壳网

壳叔搞笑时间

看了前任 3,不由得对前任牵肠挂肚起来……这几天天气那么冷,不知道他冻死没有

正文

这几天一直看 React Native 调用手机权限一些进行操作,毕竟这也算是一种乐趣吧。
上次读取手机联系人,有一个很方便的组件,配置一下原生代码权限,很轻易就读取出来了。

组件名为:React Native 联系人组件 react-native-contacts

这次就先调用 Android 原生代码,iOS 就等下一篇吧,啊哈哈哈哈~

开始干货

1.第一步 Android 权限

在 AndroidManifest.xml 文件配置以下内容

    <!-- 发送短信 -->
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <!-- 读取短信 -->
    <uses-permission android:name="android.permission.READ_SMS"/>
    <!-- 接收短信 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

2.写 React 注册类

创建一个 ExampleReactPackage.java 文件

import com.facebook.react.ReactPackage;  
import com.facebook.react.bridge.JavaScriptModule;  
import com.facebook.react.bridge.NativeModule;  
import com.facebook.react.bridge.ReactApplicationContext;  
import com.facebook.react.uimanager.ViewManager;  
  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;  
  
public class ExampleReactPackage implements ReactPackage {  
  @Override  
  public List createNativeModules(ReactApplicationContext reactContext) {  
        List modules = new ArrayList<>();  
        modules.add(new RnTest(reactContext));  
        return modules;  
  }  
  
 
  public List> createJSModules() {  
        return Collections.emptyList();  
  }  
  
  @Override  
  public List createViewManagers(ReactApplicationContext reactContext) {  
        return Collections.emptyList();  
  }  
}

3.实例化注册类

在 MainApplication.java 添加以下代码,来实例化自己刚刚的注册类。

@Override  protected List getPackages() { return Arrays.asList( new MainReactPackage(), // 实例化注册类  new ExampleReactPackage()); } };@Override  
protected List getPackages() {  
    return Arrays.asList(  
      new MainReactPackage(), 
      // 实例化注册类  
      new ExampleReactPackage());  
  
}

4.开始写被调用的原生代码


import android.content.ContentResolver;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.IllegalViewOperationException;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ReactNativeSMS extends ReactContextBaseJavaModule {
 
    final String SMS_URI_ALL = "content://sms/";
    final String SMS_URI_INBOX = "content://sms/inbox";
    final String SMS_URI_SEND = "content://sms/sent";
    final String SMS_URI_DRAFT = "content://sms/draft";
    
    public RnTest(ReactApplicationContext reactContext) {
        super(reactContext);
 
    }

    @ReactMethod
    public void getSmsInPhone(Promise promise) {


        StringBuilder smsBuilder = new StringBuilder();

        WritableMap map = Arguments.createMap();

        try {
            ContentResolver cr = super.getCurrentActivity().getContentResolver();
            String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};
            Uri uri = Uri.parse(SMS_URI_ALL);
            Cursor cur = cr.query(uri, projection, null, null, "date desc");

            if (cur.moveToFirst()) {
                String name;
                String phoneNumber;
                String smsbody;
                String date;
                String type;

                int nameColumn = cur.getColumnIndex("person");
                int phoneNumberColumn = cur.getColumnIndex("address");
                int smsbodyColumn = cur.getColumnIndex("body");
                int dateColumn = cur.getColumnIndex("date");
                int typeColumn = cur.getColumnIndex("type");

                do {
                    name = cur.getString(nameColumn);
                    phoneNumber = cur.getString(phoneNumberColumn);
                    smsbody = cur.getString(smsbodyColumn);

                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                    Date d = new Date(Long.parseLong(cur.getString(dateColumn)));
                    date = dateFormat.format(d);

                    int typeId = cur.getInt(typeColumn);
                    if (typeId == 1) {
                        type = "接收";
                    } else if (typeId == 2) {
                        type = "发送";
                    } else {
                        type = "";
                    }

                    smsBuilder.append("[");
                    smsBuilder.append("\"name\" : \"" + name + "\",");
                    smsBuilder.append("\"phoneNumber\" : \"" + phoneNumber + "\",");
                    smsBuilder.append("\"smsbody\" : \"" + smsbody + "\",");
                    smsBuilder.append("\"date\" : \"" + date + "\" ,");
                    smsBuilder.append("\"type\" :\"" + type + "\" ");
                    smsBuilder.append("], ");

                    if (smsbody == null) smsbody = "";
                } while (cur.moveToNext());

            } else {
                smsBuilder.append("no result!");
            }

            smsBuilder.append("getSmsInPhone has executed!");
        } catch (SQLiteException ex) {
            Log.e("SQLiteException", ex.getMessage().toString());
        }
        map.putString("sms", smsBuilder.toString());
        promise.resolve(map);
    }


}

5.JS 调用原生代码

先 import NativeModules 模块

import { NativeModules } from 'react-native';

然后 JS 进行调用

   /**
     * 获取短信内容
     */
    getAllSMS() {
 
        var rnToastAndroid = NativeModules.ToastByAndroid;
        rnToastAndroid.getSmsInPhone().then((map) => {
            console.log(map['sms']);
            
            //想更直观一点,可以解除下面的注释
            //alert(map['sms']);
           
        }, (code, message) => {
            alert(message);
        });
    }

控制台输出日志

imagepng

伸个懒腰,今天完美收工。
偷偷的告诉大家,上面的代码是我东拼西凑,看了好多文章活生生凑齐来的。
这点代码,就不上传 GitHub 了,如果有问题,可以加下方的交流群,亲自为你解答。

关于我们

程序员太辛苦了

请善待你们身边的每一位程序员~

欢迎在评论写下你的程序员趣事,程序员不是一个死板的职业~~

以上内容,均来自互联网~

欢迎扫描二维码加入我们的小组织 ,大家都叫壳叔,期待你的到来。
黑壳网交流群 Q 群:200408242

11a84075a304ac57f6d37323512fd24cde9836350b9d80148b282eeaa188b196c2358d4ffd7006cbpng

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1090 引用 • 3467 回帖 • 298 关注
  • 黑壳网
    68 引用 • 44 回帖 • 2 关注
  • 壳叔
    48 引用 • 31 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 445 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...