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

时间:2016-11-26 03:22:07

标签: javascript android broadcastreceiver nativescript android-pendingintent

我正在使用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应用程序中的第一个破解而且我在有点失落。任何帮助将不胜感激。

2 个答案:

答案 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可以将其销毁。