本文由黑壳博客发布
本文来源 [上篇] 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); }); }
控制台输出日志
伸个懒腰,今天完美收工。
偷偷的告诉大家,上面的代码是我东拼西凑,看了好多文章活生生凑齐来的。
这点代码,就不上传 GitHub 了,如果有问题,可以加下方的交流群,亲自为你解答。
关于我们
程序员太辛苦了
请善待你们身边的每一位程序员~
欢迎在评论写下你的程序员趣事,程序员不是一个死板的职业~~
以上内容,均来自互联网~
欢迎扫描二维码加入我们的小组织 ,大家都叫壳叔,期待你的到来。
黑壳网交流群 Q 群:200408242
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于