获得成功/失败对NativeScript / Android中的android.SmsManager.sendTextMessage()的响应

时间:2018-02-07 11:27:33

标签: android angular nativescript

我从NativeScript移动应用程序发送短信,这是以下代码:

sendSms(numbers, body) {
        let sms = android.telephony.SmsManager.getDefault();
        sms.sendTextMessage(numbers, null, body, null, null);
    }

SMS使用这段代码成功发送,但是如果SMS已成功发送给我的应用程序用户,我想收到回复。

如果它是承诺的话:

    sms.sendTextMessage(numbers, null, body, null, null).then(res => {
       if(res=='success') someCode;
    })

关于如何实现这一目标的任何想法?

感谢。

2 个答案:

答案 0 :(得分:2)

正如Archer建议的那样,使用PendingIntents会在发送和/或发送短信时收到通知。

PendingIntent.getBroadcast() - 将检索PI实例。

var pISent = android.app.PendingIntent.getBroadcast(context, 0, new android.content.Intent(android.telephony.SmsManager.STATUS_ON_ICC_SENT), 0);
sms.sendTextMessage(numbers, null, body, pISent, null);

详细了解Android文档中的待处理意图,以便更好地了解Android的工作原理 - https://developer.android.com/reference/android/app/PendingIntent.html

答案 1 :(得分:2)

感谢大家的帮助,我已经查看了PendingIntent android参考资料,并且我已经编写了一个简单的NativeScript x TypeScript x Angular解决方案来实现这一目标。

以下是其他人在将来寻找它的情况。

import * as app from "tns-core-modules/application";
import * as utils from "utils/utils";

@Injectable()
export class SmsService {
    context = utils.ad.getApplicationContext();
    socket;

    constructor() {

    }

    sendSms(numbers, body) {
        let id = 'messageSent';
        let pendingIntent = this.pendingIntent(id);
        let sms = android.telephony.SmsManager.getDefault();
        sms.sendTextMessage(numbers, null, body, pendingIntent, null);
        this.broadcastReciever(id, () => {
            console.log('This should call after sent.');
        })
    }

    broadcastReciever(id, cb) {
        app.android.registerBroadcastReceiver(id, () => {
            cb();
        });
    }

    pendingIntent(id) {
        let intent = new android.content.Intent(id);
        return android.app.PendingIntent.getBroadcast(this.context, 0, intent, 0);
    }

快速编辑:在回调的broadcastReciever()功能中,您必须取消注册接收器,因为每次发送短信时它都会注册新的接收器,所以这就是现在的样子:

sendSms(numbers, body) {
        let sms = android.telephony.SmsManager.getDefault();
        sms.sendTextMessage(numbers, null, body, this.pendingIntentSent, null);
        this.broadcastReciever(this.id, () => {
            console.log('@@@ SUCCESFULLY SENT @@@');
            app.android.unregisterBroadcastReceiver(this.id);
        })
    }