1

我使用nativescript建立一個應用程序,將程序在緊急情況下發送預建的文本預設的多個政黨。如何使用廣播reciever擺脫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); 

然後我發送的文字,傳遞掛起意圖VAR:

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

然後我嘗試使用我在nativescript docs中找到的信息製作基本的廣播接收器,當接收到預期數據時,它應該將某些內容記錄到控制檯。

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

問題是:沒有任何反應。我希望得到「@@@@@ text @@@@@」登錄到控制檯我已經搜索了很多,我想我可能需要在清單中添加一些關於這個廣播接收者的內容,或者也許我的執行力度是錯的,但畢竟是我的Android應用程序第一次破裂和我在一個小的損失的。任何幫助,將不勝感激。

+1

我不會做NativeScript,但是如果你在運行時註冊Receiver,你需要發送一個隱含的'Intent';即一個'Intent'實例化了一個唯一的,任意的'String'動作參數,而不是'Context'和'Class'。然後,您需要爲Receiver註冊'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; 

爲了解釋:它似乎@Mike中號提到的每個意圖對象需要一些字符串作爲ID

然後使「的PendingIntent」對象,再次作爲@Mike M.提到我需要鉤住「getBroadcast」的方法,然後我需要通過未決的意圖應用上下文作爲第一個參數,然後0,則意圖對象與id。然後

未決意圖通過傳遞意圖id作爲第一個參數和回調作爲第二是在一個簡單的廣播接收機功能可接收的。我已經測試過,並且工作完美。

+0

不,我說'registerBroadcastReceiver()'的第一個參數應該是行爲,而不是'PendingIntent',這正是你在做什麼。我向PendingIntent本身提出的唯一改變是用'getBroadcast()'獲得它。 'Intent'實例是我說不通過'Context'的地方。此外,該行動不一定是隨機的。只需要註冊Receiver即可。 –

+0

你是對的 - 我已經更新了我的答案以反映這一點並重構了代碼。再次感謝。我花了近4個小時研究android API文檔,並且您的幫助指引我朝着正確的方向發展。 – HelloWorld

+0

是的,我說「獨一無二」的原因是試圖說它可以是任何你想要的東西,只要它不是一個已經意味着別的東西的行爲,其他應用程序可能正在傾聽。我應該更好地解釋。確保唯一性的常用方法是將您的應用/軟件包名稱預先添加到操作描述中。 Anyhoo,對不起,如果我在我最後的評論中有點生硬。今天有點令人沮喪。 :) 真高興你做到了。乾杯! –