如何使用广播接收器从 smsmanager (nativescript) 获取发送的意图
How to use broadcast reciever to get sent intent from smsmanager (nativescript)
我正在使用 nativescript 构建一个应用程序,该应用程序将在紧急情况下以编程方式向多个预设方发送预先构建的文本。
我有一组 phone 个数字,我想遍历每个数字,使用 SMSManager 发送文本和 sentIntent 参数 seen in android docs 以验证文本是否已发送,然后再继续下一个数组项。
我创建了 pendingIntent 变量以传递给 "sms.sendTextMessage",如下所示:
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);
然后我发送文本,传递待处理的意图 var:
sms.sendTextMessage("5555555555", null, "hello", pendingIntent, null);
然后我尝试使用我在 nativescript docs 中找到的信息制作一个基本的广播接收器,它应该在收到预期数据时将一些内容记录到控制台。
app.android.registerBroadcastReceiver(pendingIntent, function() {
console.log("@@@@@ text sent @@@@@");
});
问题是:没有任何反应。我希望将“@@@@@发送的文本@@@@@”记录到控制台。我在谷歌上搜索了很多,我在想也许我需要在清单中添加一些关于这个广播接收器的东西,或者也许我的表达在某处是错误的,但这是我第一次尝试 android 应用程序,我有点不知所措。任何帮助将不胜感激。
我将在这里回答我自己的问题,以防其他人遇到这个问题。
有效的代码是:
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。
然后创建 "pendingIntent" 对象,正如@Mike M. 提到的,我需要挂钩到 "getBroadcast" 方法,然后我需要将未决意图作为第一个参数传递给应用程序上下文,然后是 0,然后是具有 id 的意图对象。
然后,只需将意图 ID 作为第一个参数传递并将回调作为第二个参数传递,即可在简单的广播接收器函数中接收未决意图。我已经测试过,它运行良好。
以下是一个简化版本,没有基本代码方法可以满足您的需求 运行。您需要权限并确保用户接受这些权限。这也是创建广播接收器的两种方式之一(这是 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);
}
上面的代码是在 activity 内部创建的,并使用主 ui 线程。这意味着如果用户退出 activity,广播接收器将徘徊在边缘,android 可以销毁它。
我正在使用 nativescript 构建一个应用程序,该应用程序将在紧急情况下以编程方式向多个预设方发送预先构建的文本。
我有一组 phone 个数字,我想遍历每个数字,使用 SMSManager 发送文本和 sentIntent 参数 seen in android docs 以验证文本是否已发送,然后再继续下一个数组项。
我创建了 pendingIntent 变量以传递给 "sms.sendTextMessage",如下所示:
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);
然后我发送文本,传递待处理的意图 var:
sms.sendTextMessage("5555555555", null, "hello", pendingIntent, null);
然后我尝试使用我在 nativescript docs 中找到的信息制作一个基本的广播接收器,它应该在收到预期数据时将一些内容记录到控制台。
app.android.registerBroadcastReceiver(pendingIntent, function() {
console.log("@@@@@ text sent @@@@@");
});
问题是:没有任何反应。我希望将“@@@@@发送的文本@@@@@”记录到控制台。我在谷歌上搜索了很多,我在想也许我需要在清单中添加一些关于这个广播接收器的东西,或者也许我的表达在某处是错误的,但这是我第一次尝试 android 应用程序,我有点不知所措。任何帮助将不胜感激。
我将在这里回答我自己的问题,以防其他人遇到这个问题。
有效的代码是:
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。
然后创建 "pendingIntent" 对象,正如@Mike M. 提到的,我需要挂钩到 "getBroadcast" 方法,然后我需要将未决意图作为第一个参数传递给应用程序上下文,然后是 0,然后是具有 id 的意图对象。
然后,只需将意图 ID 作为第一个参数传递并将回调作为第二个参数传递,即可在简单的广播接收器函数中接收未决意图。我已经测试过,它运行良好。
以下是一个简化版本,没有基本代码方法可以满足您的需求 运行。您需要权限并确保用户接受这些权限。这也是创建广播接收器的两种方式之一(这是 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);
}
上面的代码是在 activity 内部创建的,并使用主 ui 线程。这意味着如果用户退出 activity,广播接收器将徘徊在边缘,android 可以销毁它。