1

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

У меня есть массив телефонных номеров и вы хотите перебирать их по каждому из них, используя 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); 

я затем отправить текст, переходящим в ожидании умысел вар:

sms.sendTextMessage("5555555555", null, "hello", pendingIntent, null); 

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

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

Проблема в том, что ничего не происходит. Я бы ожидал получить «@@@@@ [email protected]@@@@», который был отправлен на консоль. Я много искал и думаю, может быть, мне нужно добавить что-то об этом приемнике трансляции в манифест или возможно, мое вмешательство где-то не так, но это моя первая трещина в приложении Android, и я немного потеряю. Любая помощь будет оценена.

+1

Я не делаю NativeScript, но если вы регистрируете приемник во время выполнения, вам нужно отправить неявное 'Intent'; то есть «Intent», созданный с помощью уникального, произвольного аргумента действия «String», а не «Context» и «Class». Затем вам нужно зарегистрировать приемник для этого действия «String», и, похоже, для этого действие должно быть первым аргументом в вашем вызове 'registerBroadcastReceiver()', а не 'pendingIntent'. И ваш 'PendingIntent' должен быть получен с помощью' getBroadcast() ', а не' getActivity() '. –

+0

Эй, это помогло мне найти решения :) спасибо! Я создаю код, который работал – HelloWorld

ответ

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; 

Для объяснения:., кажется, как M @ Mike упоминается каждый намерение объекта необходима строка как идентификатор

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

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

+0

Нет, я сказал, что первым аргументом 'registerBroadcastReceiver()' должно быть действие, а не 'PendingIntent', что и есть то, что вы делаете. Единственное изменение, которое я предложил самому «PendingIntent», это получить его с помощью 'getBroadcast()'. Реализация «Intent» - это то место, где я сказал, чтобы не передавать «Контекст». Кроме того, действие не обязательно должно быть случайным. Это просто должно быть то, для чего вы регистрируете приемник. –

+0

Вы правы - я обновил свой ответ, чтобы отразить это и реорганизовать код. Еще раз спасибо. Я потратил почти 4 часа на изучение документов API Android, и ваша помощь указала мне в правильном направлении. – HelloWorld

+0

Да, причина, по которой я сказал «уникальная, произвольная», заключалась в том, чтобы попытаться сказать, что это может быть почти все, что вы хотите, до тех пор, пока это не действие, которое уже означает что-то еще, что другие приложения могут слушать. Я должен был объяснить это лучше. Обычным способом обеспечения уникальности для этого является добавление имени вашего приложения/пакета в описание действия. Anyhoo, извините, если я немного опустился в своем последнем комментарии. Сегодня это немного расстроило. :) Рад, что у тебя это работает. Ура! –

Смежные вопросы