Javascript 如何使用广播接收器从smsmanager(nativescript)获取发送意图
我正在使用nativescript构建一个应用程序,在紧急情况下,它将以编程方式向多个预设方发送预构建文本 我有一个电话号码数组,希望对每个电话号码进行迭代,使用SMSmanager发送文本,并使用sentinent参数验证文本是否已发送,然后再转到下一个数组项 我已创建PendingEvent变量以传递到“sms.sendTextMessage”中,如下所示:Javascript 如何使用广播接收器从smsmanager(nativescript)获取发送意图,javascript,android,broadcastreceiver,nativescript,android-pendingintent,Javascript,Android,Broadcastreceiver,Nativescript,Android Pendingintent,我正在使用nativescript构建一个应用程序,在紧急情况下,它将以编程方式向多个预设方发送预构建文本 我有一个电话号码数组,希望对每个电话号码进行迭代,使用SMSmanager发送文本,并使用sentinent参数验证文本是否已发送,然后再转到下一个数组项 我已创建PendingEvent变量以传递到“sms.sendTextMessage”中,如下所示: var sms = android.telephony.SmsManager.getDefault(); var utils = re
var sms = android.telephony.SmsManager.getDefault();
var utils = require("utils/utils");
//Gets application's current state
var context = utils.ad.getApplicationContext();
//Create a replica of Android's intent object
var intent = new android.content.Intent(context, com.tns.NativeScriptActivity.class);
//Create a replica of Android's pendingIntent object using context and intent
var pendingIntent = android.app.PendingIntent.getActivity(context, 1, intent, android.app.PendingIntent.FLAG_UPDATE_CURRENT);
然后,我发送文本,传入挂起的intent变量:
sms.sendTextMessage("5555555555", null, "hello", pendingIntent, null);
然后,我尝试使用在中找到的信息制作一个基本的广播接收器,当它接收到预期的数据时,应该只将一些内容记录到控制台
app.android.registerBroadcastReceiver(pendingIntent, function() {
console.log("@@@@@ text sent @@@@@");
});
问题是:什么都没有发生。我希望收到“@@@@”文本@@@@@“已登录到控制台。我在谷歌上搜索了很多,我想也许我需要在清单中添加一些关于这个广播接收器的信息,或者也许我的实现在某个地方是错误的,但这是我第一次尝试安卓应用程序,我有点不知所措。任何帮助都将不胜感激。我将在这里回答我自己的问题,以防其他人遇到这种情况 有效的代码是:
var app = require("application");
var utils = require("utils/utils");
var context = utils.ad.getApplicationContext();
var sms = android.telephony.SmsManager.getDefault();
var SendMessages = {
init: function() {
var id = "messageSent";
this.sendText(id, this.pendingIntent(id));
},
sendText: function(id, pendingIntent) {
sms.sendTextMessage("5555555555", null, "Hello :)", pendingIntent, null);
this.broadcastReceiver(id, function() {
console.log("$$$$$ text sent $$$$$");
});
},
pendingIntent: function(id) {
var intent = new android.content.Intent(id);
return android.app.PendingIntent.getBroadcast(context, 0, intent, 0);
},
broadcastReceiver: function(id, callback) {
app.android.registerBroadcastReceiver(id, function() {
callback();
});
}
};
module.exports = SendMessages;
解释:似乎@Mike M提到每个意图对象都需要一些字符串作为id
然后要生成“PendingEvent”对象,正如@Mike M.提到的,我需要挂接到“getBroadcast”方法,然后我需要将pendingIntent作为第一个参数传递给app上下文,然后是0,然后是id为的intent对象
然后,在一个简单的广播接收器函数中,只要将intent id作为第一个参数传递,并将回调作为第二个参数传递,就可以接收挂起的intent。我已经测试过了,它工作得很好。下面是一个简化版本,没有bs代码方法来运行它。您需要权限,并确保用户接受这些权限。这也是创建广播接收器的两种方法之一(这是
上下文注册接收器
方法),请在此处阅读有关这两种类型的更多信息:
有关注册广播接收器的信息:
AndroidManifest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="__PACKAGE__"
android:versionCode="10000"
android:versionName="1.0">
<!-- ...more code -->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- ...more code -->
</manifest>
上面的代码是在活动内部创建的,并使用主ui线程。这意味着,如果用户退出活动,广播接收器将徘徊在边缘,android可以销毁它。我不做NativeScript,但如果您在运行时注册接收器,则需要向其发送隐式
意图;i、 例如,一个意图
实例化为一个唯一的、任意的字符串
操作参数,而不是上下文
和类
。然后,您需要为该字符串
操作注册接收者,看起来,要做到这一点,该操作应该是registerBroadcastReceiver()
调用中的第一个参数,而不是PendingContent
。您的pendingent
需要使用getBroadcast()
,而不是getActivity()
。这帮助我找到了解决方案:)谢谢!我提出了有效的代码不,我说了registerBroadcastReceiver()
的第一个参数应该是操作,而不是PendingEvent
,这正是您正在做的。我建议对pendingent
本身进行的唯一更改是使用getBroadcast()
获取它。Intent
实例化就是我说不要传递上下文的地方。而且,动作不一定是随机的。它只需要是你注册接收者的目的。你是对的-我已经更新了我的答案来反映这一点,并重构了代码。再次感谢。我花了近4个小时研究android API文档,你的帮助为我指明了正确的方向。是的,我之所以说“独特、任意”是为了告诉你,它几乎可以是你想要的任何东西,只要它不是一个已经意味着其他东西的动作,其他应用程序可能会听到。我应该解释得更清楚些。确保唯一性的通常方法是在操作描述前加上应用程序/程序包名称。不管怎样,如果我在最后的评论中有点直言不讳的话,我很抱歉。所以今天我有点沮丧很高兴你让它工作了。干杯
import * as application from 'tns-core-modules/application';
import * as platform from 'tns-core-modules/platform';
import * as utils from 'tns-core-modules/utils/utils';
import * as permissions from 'nativescript-permissions';
// ...more code
try {
await permissions.requestPermission(
android.Manifest.permission.SEND_SMS,
'Need to send.'
);
console.log('SEND_SMS permission accepted.');
const text = 'Herro.';
const mobileNumber = '55555555';
const intentFilter = 'something_here';
const context = utils.ad.getApplicationContext();
const intent = new android.content.Intent(intentFilter);
const pendingIntent = android.app.PendingIntent.getBroadcast(context, 0, intent, 0);
const sms = android.telephony.SmsManager.getDefault();
application.android.registerBroadcastReceiver(intentFilter, function() {
console.log(`Text has been sent: ${text}`);
});
setTimeout(() => {
console.log('Sending text.');
sms.sendTextMessage(mobileNumber, null, text, pendingIntent, null);
}, 5000);
} catch (error) {
console.log('Permission error:', error);
}