落嘤神斧
落嘤神斧
  • 发布:2022-11-24 22:08
  • 更新:2023-03-28 21:38
  • 阅读:369

BroadcastReceiver 中的 getResultCode 怎么才能调用呢?

分类:Native.js

在做双卡发送短信的时候,发现 plus.messaging 会发送失败,只能用卡一,from 在监听的时候才有效。于是就使用了 Android 中的 smsManager,但是无法监听到短信的发送成功与否。

2022-11-24 22:08 负责人:无 分享
已邀请:
落嘤神斧

落嘤神斧 (作者)

后来我看到Android 中判断短信发送是否成功的例子,其他的倒也搞出来了,onReceiver 和 action 也都能收到,但是 getResultCode 这个方法实在是无法调用,因广播接收的 receiver 中并没有 getResultCode 这个方法,无法调用。

// 全局变量  
const main = plus.android.runtimeMainActivity();  
// 发送短信  
sendMessageFn(message) {  
    // message 的结构是 {to:'收件人号码',from:'发件人号码',body:'短信内容'}  
    plus.android.requestPermissions(  
        ['android.permission.SEND_SMS'],  
        res => {  
            if (res.granted.length > 0) {  
                // phoneNumberList 是本机中的号码组成的数组,在这里是用来确认发件人是否存在  
                // 它的结构是 [{phoneNumber:'卡槽中的号码',cardIndex:'卡槽的索引'}]  
                const filterArray = this.phoneNumberList.filter(item => item.phoneNumber === message.from);  
                if (filterArray.length > 0) {  
                    const fromIndex = filterArray[0].cardIndex;  
                    const sManager = main.getSystemService('telephony_subscription_service');  
                    const subscriptionInfoList = plus.android.invoke(sManager, 'getActiveSubscriptionInfoList');  
                    let sInfo;  
                    if (fromIndex === 0) {  
                        //获取卡信息  
                        sInfo = plus.android.invoke(subscriptionInfoList, 'get', 0);  
                    }  
                    if (fromIndex === 1) {  
                        //获取卡信息  
                        sInfo = plus.android.invoke(subscriptionInfoList, 'get', 1);  
                    }  
                    //获取卡id  
                    const id = plus.android.invoke(sInfo, 'getSubscriptionId');  
                    //获取卡id获取SMSManagers对象  
                    const managers = plus.android.invoke('android.telephony.SmsManager', 'getSmsManagerForSubscriptionId', id);  
                    //分割短信内容 短信规定不能大于70字,大于70会被分割,分开发送  
                    const list = plus.android.invoke(managers, 'divideMessage', message.body);  
                    // 创建 sentIntent 参数  
                    const sentIntent = new Intent(SENT_SMS_ACTION);  
                    const sentPI = PendingIntent.getBroadcast(main, 0, sentIntent, PendingIntent.FLAG_CANCEL_CURRENT);  
                    //发送短信  
                    const listLen = list.size();  
                    for (let i = 0; i < listLen; i++) {  
                        const tmp = list.get(i);  
                        plus.android.invoke(managers, 'sendTextMessage', message.to, null, tmp, sentPI, null);  
                    }  
                } else {  
                    console.log('本机不存在当前号码');  
                }  
            }  
        },  
        err => {  
            console.log('获取短信权限失败时触发', err);  
        }  
    );  
}  
// 广播接收  
const receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver',{  
    onReceive: function(context, intent) {  
        // Android 中可以在这里调用 getResultCode,但是 nativeJS 要怎么调用呢?  
        // 已经尝试过  
        //  plus.android.invoke(receiver, 'getResultCode'); 返回 undefined  
        //  receiver.getResultCode();   返回 null  
        var action = intent.getAction();  
        console.log('action', action);  
    }  
});
落嘤神斧

落嘤神斧 (作者)

为什么不用 plus.messaging?
因为这里面的 from 只有在监听短信接收的时候可以看到,发送的时候设置无效,只能是默认卡。所以想要设置发件人是不行的。最后我只能通过 Android 中的 API 实现双卡短信的发送。

落嘤神斧

落嘤神斧 (作者)

发现是在定义广播接收的 'io.dcloud.feature.internal.reflect.BroadcastReceiver' 这个类中,并不存在 getResultCode 这个方法,所以无法获取短信发送是否成功

鑫辰大海

鑫辰大海

请问这个问题,最终是怎么解决的?

要回复问题请先登录注册