Я использую nativescript для создания приложения, которое будет программно отправлять предварительно созданный текст нескольким заранее заданным сторонам в случае возникновения чрезвычайной ситуации.

У меня есть массив телефонных номеров, и я хочу перебрать каждый из них, используя SMSmanager для отправки текста и аргумента sentIntent видно в документации по Android, чтобы убедиться, что текст был отправлен, прежде чем перейти к следующему элементу массива.

Я создал переменную 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, которые должны просто записывать что-то в консоль, когда она получает ожидаемые данные.

app.android.registerBroadcastReceiver(pendingIntent, function() {
        console.log("@@@@@ text sent @@@@@");
    });

Проблема в том, что ничего не происходит. Я ожидал, что в консоль попадет "" @@@@@ text sent @@@@@ ". Я много гуглил и думаю, может быть, мне нужно добавить что-нибудь об этом широковещательном приемнике в манифест, или возможно, моя имплементация где-то не так, но это моя первая трещина в приложении для Android, и я немного растерялся. Любая помощь будет принята с благодарностью.

3
HelloWorld 26 Ноя 2016 в 06:22

2 ответа

Лучший ответ

Я собираюсь ответить на свой вопрос здесь, если кто-то еще столкнется с этим.

Код, который сработал:

    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 упомянул, что каждый объект намерения нуждается в некоторой строке в качестве идентификатора.

Затем, чтобы создать объект «pendingIntent», опять же, как упомянул @Mike M., мне нужно было подключиться к методу «getBroadcast», затем мне нужно было передать ожидающее намерение контекста приложения в качестве первого аргумента, затем 0, затем объект намерения с Я бы.

Затем ожидающее намерение может быть получено в простой функции широковещательного приемника путем простой передачи идентификатора намерения в качестве первого аргумента и обратного вызова в качестве второго. Я тестировал, и он отлично работает.

3
HelloWorld 26 Ноя 2016 в 09:09

Ниже приводится упрощенная версия, без подхода кода 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);
}

Приведенный выше код создается внутри действия и использует основной поток пользовательского интерфейса. Это означает, что если пользователь выйдет из активности, широковещательный приемник останется в подвешенном состоянии, и Android может его уничтожить.

0
basickarl 16 Июн 2020 в 13:57