本文由黑壳博客发布
本文来源 [上篇] React-Native 调用原生代码获取所以短信记录 - 黑壳网
壳叔搞笑时间
看了前任 3,不由得对前任牵肠挂肚起来……这几天天气那么冷,不知道他冻死没有
正文
这几天一直看 React Native 调用手机权限一些进行操作,毕竟这也算是一种乐趣吧。
上次读取手机联系人,有一个很方便的组件,配置一下原生代码权限,很轻易就读取出来了。
组件名为:React Native 联系人组件 react-native-contacts
这次就先调用 Android 原生代码,iOS 就等下一篇吧,啊哈哈哈哈~
开始干货
1.第一步 Android 权限
在 AndroidManifest.xml 文件配置以下内容
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);
});
}
控制台输出日志
伸个懒腰,今天完美收工。
偷偷的告诉大家,上面的代码是我东拼西凑,看了好多文章活生生凑齐来的。
这点代码,就不上传 GitHub 了,如果有问题,可以加下方的交流群,亲自为你解答。
关于我们
程序员太辛苦了
请善待你们身边的每一位程序员~
欢迎在评论写下你的程序员趣事,程序员不是一个死板的职业~~
以上内容,均来自互联网~
欢迎扫描二维码加入我们的小组织 ,大家都叫壳叔,期待你的到来。
黑壳网交流群 Q 群:200408242
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于