如何在React Native中用手机信用程序化地发送短信?

问题描述 投票:0回答:1

我正在寻找一种方法来发送 在React Native中以编程方式发送短信,而无需使用第三方API。 如Twilio或Firebase等。我的目的是用手机信用在我的 SIM卡.

react-native smsmanager
1个回答
0
投票

我发现从下面的链接的解决方案,但编辑了一下,因为原来的瓦给错误的编译过程中。

注意: 这个解决方案需要你扩展你当前的React Native代码库与 原生Java 代码模块。但不要被这些吓到。

链接 在React-Native Android中直接发送短信,作者:Fateme Fazli。

步骤1:创建SendSMSModule.java。

进入你的 android/app/src/main/java/com/your_project_name 文件夹,以创建 DirectSmsModule.java 模块,使用下面的Java代码。

//DirectSmsModule.java  : This is the name of the Java Class/File   
package com.your_project_name; //make sure to change to your project's actual name.

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;
import android.telephony.SmsManager;  //++ make sure this package is available always

public class DirectSmsModule extends ReactContextBaseJavaModule {

    public DirectSmsModule(ReactApplicationContext reactContext) {
        super(reactContext); //required by React Native
    }

    @Override
    //getName is required to define the name of the module represented in JavaScript
    public String getName() { 
        return "DirectSms";
    }

    @ReactMethod
    public void sendDirectSms(String phoneNumber, String msg) {
        try {      
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phoneNumber, null, msg, null, null);    
            System.out.println("message sent successfully.");
        } catch (Exception ex) {
            System.out.println("couldn't send message.");
        } 
    }
}

步骤2:创建DirectSmsPackage.java模块。

在同一文件夹中 android/app/src/main/java/com/your_project_name 你现在大概有3个Java文件,添加第四个。DirectSmsPackage.java

//DirectSmsPackage.java
package com.your_project_name;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.enoxscanner.DirectSmsModule;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DirectSmsPackage implements ReactPackage {

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(
            ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        //this is where you register the module
        modules.add(new DirectSmsModule(reactContext));
        return modules;
    }
}

第三步:注册DirectSmsPackage

现在把我们刚刚创建的模块注册到上面去。这几乎和你在添加或安装后必须手动链接的那些包一样。

在同一个文件夹中,找到您的 MainApplication.java 文件,找到下面的代码部分,然后添加高亮显示的那一行为 加上这一行: 注意,你正在编辑 getPackages() function

@Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // Packages that cannot be autolinked yet can be added manually here, for example:
          // packages.add(new MyReactNativePackage());

          packages.add(new DirectSmsPackage()); //++ add this line here ++
          return packages;
        }

第四步:在您的RN脚本中调用sendDirectSMS。

import React, { Component } from 'react';
import { NativeModules, PermissionsAndroid } from 'react-native'; 

//++ import NativeModules since we are using a Native external module
...

const DirectSms = NativeModules.DirectSms;

export class SMSScreen extends Component {

sendDirectSms = async () => {
        try {
            const granted = await PermissionsAndroid.request(
                PermissionsAndroid.PERMISSIONS.SEND_SMS,
                {
                    title: 'Tadiwanashe App Sms Permission',
                    message:
                        'Tadiwanashe App needs access to your inbox ' +
                        'so you can send messages in background.',
                    buttonNeutral: 'Ask Me Later',
                    buttonNegative: 'Cancel',
                    buttonPositive: 'OK',
                },
            );
            if (granted === PermissionsAndroid.RESULTS.GRANTED) {
                DirectSms.sendDirectSms('0772......', 'This is a direct message from your app.');
            } else {
                console.log('SMS permission denied');
            }
        } catch (err) {
            console.warn(err);
        }
    }

    render() {
        return (
            <View style={styles.mother_container}>
                <View style={styles.container}>
                    <TextInput secureTextEntry={true} style={styles.input}
                        underlineColorAndroid="transparent"
                        placeholder="Enter PIN."
                        placeholderTextColor="black"
                        autoCapitalize="none"
                        onChangeText={this.handlePIN}
                        textAlign={'center'}
                    />
                    <TouchableOpacity
                        style={styles.button}
                        onPress={() => this.sendDirectSms()}>
                        <Text style={styles.submitButtonText} selectTextOnFocus={true}> Submit </Text>
                    </TouchableOpacity>
                </View>
                <AppFooter bgColor='#fff' textColor='grey' />
            </View>
        )
    }
}

export default SMSScreen ;

注意:自动发送短信的应用程序可能不被允许在谷歌上使用。

  • 这类自动发送短信的应用可能不被谷歌允许。
  • 除非你的应用程序被用户授予权限,否则你不会收到短信,因此我们导入了PermissionsAndroid。
  • 上面的链接会给你适当的解释很多的details,这不完全是我的工作,但只是在意识到文章的原始代码有一些错误后进行了相应的编辑,以及文章居住在一个平台上,这使得ithard给适当的贡献相比SO。
© www.soinside.com 2019 - 2024. All rights reserved.