当前位置: 首页 > 面试题库 >

如何在Android中使用带有自定义线程ID的SmsManager发送短信?

林德华
2023-03-14
问题内容

我想创建一个带有自定义线程ID的SMS,例如“ 10001”。我怎样才能做到这一点
?原因是因为我需要实现删除SMS功能,并且删除特定SMS线程的唯一方法是通过线程ID或电话号码,并且此时无法准确获取电话号码,因此需要定义自定义线程ID在我发送短信时。

到目前为止,我只能获得正常的SMS工作代码,如下所示:

    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage("+1 203 514 6584", null, "HI Greg! ", null, null);

在此先感谢您的帮助!


问题答案:

SmsObserver类是ContentObserver该寄存器本身上的content://sms/
Uri反对接收者的地址和消息主体中的SMS表并检查改变检索对于呼出SMS消息所分配的线程ID。该类提供了您的发送类需要实现的接口,以便在确定线程ID时接收它,因为这将异步发生。

public class SmsObserver extends ContentObserver {
    private static final Handler handler = new Handler();
    private static final Uri uri = Uri.parse("content://sms/");

    private final Context context;
    private final ContentResolver resolver;
    private final String address;
    private final String body;

    public interface OnSmsSentListener {
        public void onSmsSent(int threadId);
    }

    public SmsObserver(Context context, String address, String body) {
        super(handler);

        if (context instanceof OnSmsSentListener) {
            this.context = context;
            this.resolver = context.getContentResolver();
            this.address = address;
            this.body = body;
        }
        else {
            throw new IllegalArgumentException(
                "Context must implement OnSmsSentListener interface");
        }
    }

    public void start() {
        if (resolver != null) {
            resolver.registerContentObserver(uri, true, this);
        }
        else {
            throw new IllegalStateException(
                "Current SmsObserver instance is invalid");
        }
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        Cursor cursor = null;

        try {
            cursor = resolver.query(uri, null, null, null, null);

            if (cursor != null && cursor.moveToFirst()) {
                final int type = cursor.getInt(
                    cursor.getColumnIndex(Telephony.Sms.TYPE));

                if(type == Telephony.Sms.Sent.MESSAGE_TYPE_SENT) {
                    final String address = cursor.getString(
                        cursor.getColumnIndex(Telephony.Sms.ADDRESS));
                    final String body = cursor.getString(
                        cursor.getColumnIndex(Telephony.Sms.BODY));
                    final int threadId = cursor.getInt(
                        cursor.getColumnIndex(Telephony.Sms.THREAD_ID));

                    if (PhoneNumberUtils.compare(address, this.address) &&
                        body.equals(this.body)) {

                        ((OnSmsSentListener) context).onSmsSent(threadId);
                        resolver.unregisterContentObserver(this);
                    }
                }
            }
        }
        finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }
}

在发送消息之前,需要启动此实例,并将线程ID传递到发送类的接口方法实现中。例如,如果您是Activity通过点击发送来自的Button

public class MainActivity extends Activity
    implements SmsObserver.OnSmsSentListener {
    ...

    public void onClick(View v) {
        String address = "+1 234 567 8900";
        String body = "HI Greg! ";

        new SmsObserver(this, address, body).start();

        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(address, null, body, null, null);
    }

    @Override
    public void onSmsSent(int threadId) {
        // Here's the thread ID.
    }
}

请注意,您还将需要获得READ_SMS许可。

从棒棒糖开始可能的替代方法。所发送的消息的URI将作为被附接String额外的IntentPendingIntent通过如在第四个参数sendTextMessage()的方法。额外的将具有key
"uri",并且可以将其解析为Uri,然后可以在查询中使用它ContentResolver来检索线程ID,如上所示。

例如,如果使用a BroadcastReceiver作为结果,则sendTextMessage()调用将如下所示:

Intent sentIntent = ...
PendingIntent sentPi = PendingIntent.getBroadcast(context, 0, sentIntent, 0);

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(address, null, body, sentPi, null);

并在Receiver中检索额外的内容是这样的:

public class SmsResultReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ...

        String uriString = data.getStringExtra("uri");
        Uri uri = Uri.parse(uriString);

        // Query as shown above in the ContentObserver
        ...
    }
}


 类似资料:
  • 我在我的应用程序中点击发送按钮,模拟器出现以下错误消息: HAX正在工作,模拟器以快速virt模式运行 DYLD:惰性符号绑定失败:找不到符号:_UTF8_WRITE引用自:/users/nabil/documents/development/android/sdk/tools/emulator64-x86预期在:平面名称空间中DYLD:找不到符号:_UTF8_WRITE引用自:/users/na

  • 问题内容: 您好,我搜索了一个简单的示例(Android和iOS)以通过此程序包发送短信 https://pub.dartlang.org/packages/url_launcher 在插件页面中,我仅看到如何使用电话号码打开短信本机应用程序,但没有其他消息 问题答案: 在Android上,支持完整的URI,您可以发送带有这样的正文(RFC5724)的消息: 在iOS上,您只能使用The的数字字段

  • 如何在Android中使用Twillio Api发送短信。这是我的代码。我不知道的是如何设置http请求正文。当我使用CocoaRestClient(用于api测试的工具)测试它时,它运行良好。请帮帮我。 }

  • 我想实现定制的,它必须如下所示: 所以问题是: 如何实现自定义视图这样的按钮:只是一些图像

  • 我想发送一个带有自定义头的http删除请求。 我试图用Spring的WebClient实现这一点,代码如下: 我期待着这样的事情: 但是,实际的要求是: 我错过了一些东西包括自定义标题X-FOO吗? 更新1:我将Reactornetty升级为0.7.3。释放 缺少的标题仍然缺少: 更新2:我发现在我的pom中导入了一个Reactor的BOM(铋释放),在删除该BOM后,Spring Boot 2.

  • -以上代码自动生成ID。 如何将自定义ID的数据添加到火库?我的目的是创建自定义 ID 并将文本数据写入此集合。你可以帮我吗?谢谢。