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

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 这个方法,所以无法获取短信发送是否成功

鑫辰大海

鑫辰大海

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

要回复问题请先登录注册