我正在使用nativescript构建一个应用程序,以便在紧急情况下以编程方式将预先构建的文本发送给多个预设方。
我有一组电话号码,想要迭代每一个,使用SMSmanager发送文本和sentIntent参数seen in android docs以验证文本是否已发送,然后再转到下一个数组项。< / p>
我创建了pendingIntent变量以传递给&#34; sms.sendTextMessage&#34;如下:
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 var:
sms.sendTextMessage("5555555555", null, "hello", pendingIntent, null);
然后我尝试使用我在nativescript docs中找到的信息制作基本的广播接收器,这些信息应该在收到预期数据时记录到控制台。
app.android.registerBroadcastReceiver(pendingIntent, function() {
console.log("@@@@@ text sent @@@@@");
});
问题是:没有任何反应。我希望得到&#34;&#34; @@@@@ text sent @@@@@&#34;登录到控制台。我已经搜索了很多东西,我想也许我需要在清单中添加一些关于这个广播接收器的东西,或者我的暗示在某处可能是错误的,但这是我在Android应用程序中的第一个破解而且我在有点失落。任何帮助将不胜感激。
答案 0 :(得分:3)
我将在这里回答我自己的问题,万一其他人遇到这个问题。
有效的代码是:
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提到每个intent对象都需要一些字符串作为id。
然后再创建“pendingIntent”对象,再次像@Mike M.提到我需要挂钩到“getBroadcast”方法,然后我需要将应用程序上下文作为第一个参数传递挂起的意图,然后是0,然后是意图具有id的对象。
然后,通过简单地将intent id作为第一个参数并将回调作为第二个参数传递,可以在简单的广播接收器函数中接收待处理的意图。我已经过测试,它的工作正常。
答案 1 :(得分:0)
以下是简化版本,没有使您运行它所需的bs代码方法。您需要权限,并确保用户接受这些权限。这也是创建广播接收器的两种方式之一(这是context-registered receiver
方式),在此处详细了解这两种类型:https://developer.android.com/guide/components/broadcasts#receiving-broadcasts
有关注册广播接收器的信息:https://docs.nativescript.org/api-reference/classes/application.androidapplication.html#registerbroadcastreceiver
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>
JavaScript
:
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);
}
上面的代码在活动内部创建,并使用主ui线程。这意味着,如果用户退出活动,则广播接收器将徘徊不前,而Android可以将其销毁。