Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用广播接收器从smsmanager(nativescript)获取发送意图_Javascript_Android_Broadcastreceiver_Nativescript_Android Pendingintent - Fatal编程技术网

Javascript 如何使用广播接收器从smsmanager(nativescript)获取发送意图

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

我正在使用nativescript构建一个应用程序,在紧急情况下,它将以编程方式向多个预设方发送预构建文本

我有一个电话号码数组,希望对每个电话号码进行迭代,使用SMSmanager发送文本,并使用sentinent参数验证文本是否已发送,然后再转到下一个数组项

我已创建PendingEvent变量以传递到“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);
然后,我发送文本,传入挂起的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);
}