如何在不将您的应用设为默认消息应用的情况下将短信发送到 android 中的特定应用?

Posted

技术标签:

【中文标题】如何在不将您的应用设为默认消息应用的情况下将短信发送到 android 中的特定应用?【英文标题】:How to send text SMS message into specific app in android with out making your app default message app? 【发布时间】:2018-05-30 10:25:12 【问题描述】:

我已经搜索了互联网和 ***,有很多类似的问题,但没有一个可以帮助我解决我的问题。我有一个发送和接受文本消息的 android 应用程序(不用于消息传递)。我使用以下代码发送短信。

void sendSMS(Context context, final String smsTo,final String message) 
      mContext=context;
       String SMS_SENT = "SMS SENT";

       PendingIntent sentPendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(SMS_SENT), 0);
       String SMS_DELIVERED = "SMS DELIVERED";
       PendingIntent deliveredPendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(SMS_DELIVERED), 0);
       //for sms SENT
       mContext.registerReceiver(new BroadcastReceiver() 
           @Override
           public void onReceive(Context context, Intent intent) 
               switch (getResultCode()) 
                   case Activity.RESULT_OK:
                       Toast.makeText(context, "SMS sent successfully", Toast.LENGTH_SHORT).show();
                       break;
                   case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                       Toast.makeText(context, "Generic failure cause", Toast.LENGTH_SHORT).show();
                       sendMessage.sendHTTP(mContext,smsTo, message);
                       break;
                   case SmsManager.RESULT_ERROR_NO_SERVICE:
                       Toast.makeText(context, "Service is currently unavailable", Toast.LENGTH_SHORT).show();
                       sendMessage.sendHTTP(mContext,smsTo, message);
                       break;
                   case SmsManager.RESULT_ERROR_NULL_PDU:
                       Toast.makeText(context, "No pdu provided", Toast.LENGTH_SHORT).show();
                       sendMessage.sendHTTP(mContext,smsTo, message);
                       break;
                   case SmsManager.RESULT_ERROR_RADIO_OFF:
                       Toast.makeText(context, "Radio was explicitly turned off", Toast.LENGTH_SHORT).show();
                       sendMessage.sendHTTP(mContext,smsTo, message);
                       break;
               
           
       , new IntentFilter(SMS_SENT));
//for sms Receive
        mContext.registerReceiver(new BroadcastReceiver() 
            @Override
            public void onReceive(Context context, Intent intent) 
                switch (getResultCode()) 
                    case Activity.RESULT_OK:
                        Toast.makeText(mContext.getApplicationContext(), "SMS delivered", Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(mContext.getApplicationContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
                        break;
                

            
        ,new IntentFilter(SMS_DELIVERED));

       SmsManager smsManager = SmsManager.getDefault();



       smsManager.sendTextMessage(smsTo, null, message, sentPendingIntent, deliveredPendingIntent);
   

我还有一个接收器

 public class SMSReceive extends BroadcastReceiver 

    private Context mContext;
    @Override
    public void onReceive(Context context, Intent intent) 
        Bundle bundle=intent.getExtras();
        mContext=context;
        SmsMessage[] smsMessage=null;
        String stringMessage=null;
        if(bundle!=null)
        
            Toast.makeText(context.getApplicationContext(),"message recieved",Toast.LENGTH_LONG).show();
            Object[] pdus= (Object[])bundle.get("pdus");
            smsMessage=new SmsMessage[pdus.length];
            // For every SMS message received
            for (int i=0; i < smsMessage.length; i++) 
                smsMessage[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
                stringMessage=smsMessage[i].getDisplayOriginatingAddress()+" "+ smsMessage[i].getMessageBody();
            
            if(stringMessage!=null) 
                //accept the message do something.
            

        
    

我还在 AndroidManifest.xml 文件中注册了广播接收器,如下所示

<receiver
            android:name=".SMSReceive"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="999">
                <action android:name="android.provider.telephony.SMS_RECIEVED"></action>
             </intent-filter>
        </receiver>

短信已成功发送并发送到手机,但默认短信应用正在接收短信我的应用没有收到短信。

【问题讨论】:

您是否添加了运行时权限 添加运行时权限并仔细观察 Toast 是否显示。 您是在谈论 Android Marshmallow 及更高版本的运行时权限吗?如果是这样,我有 Marshmallow 及更高版本的运行时权限。 是的。是否添加了运行时权限 是的,我已经添加了。 【参考方案1】:
android.provider.telephony.SMS_RECIEVED

将其更改为:

android.provider.Telephony.SMS_RECEIVED

或者,复制并粘贴来自the documentation 的值。

【讨论】:

谢谢,如何让我的应用只接收短信? @Yirga:在 Android 4.4-7.1 上,这是不可能的,至少对于常规短信来说是这样。在 Android 8.0+ 上,根据您的操作,您也许可以利用 SMS tokens。【参考方案2】:

首先你需要在AndroidManifest阅读接收短信的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
 <uses-permission android:name="android.permission.READ_SMS" />

还有 READ_SMS 的运行时权限 那么对于你的广播接收器:

 <receiver android:name=".network.SmsBroadcastReceiver">

        <intent-filter>
            <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
            <data
                android:port="1396"
                android:scheme="sms" />
        </intent-filter>

        <intent-filter android:priority="999">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

正如您在 intent-filterDATA_SMS_RECEIVED 中看到的那样,如果您希望只有您的应用程序能够查看消息而不是任何其他应用程序,并且它不会进入默认消息应用程序收件箱,您还可以添加端口号. 但我不确定您是否可以使用 android 发送 Data_sms 并为其添加端口号,因为就我的经验而言,这是由我的服务器而不是 android 应用程序完成的。 因此,如果您无法通过特定端口发送,您可以删除:

<data
  android:port="1396"
  android:scheme="sms" />

它也应该可以工作。

希望对你有帮助

【讨论】:

我会尝试你的答案,但如果我在注册接收器时添加端口号。如何在 SmsManager 中发送带有消息的端口号 smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(smsTo, null, message, sentPendingIntent, DeliveredPendingIntent); @Yirga 你可以改用sendDataMessage() method。

以上是关于如何在不将您的应用设为默认消息应用的情况下将短信发送到 android 中的特定应用?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在不将 ViewController 对象推入其中的情况下将对象分配给 `UINavigationController`。

如何在不将数据输入自动编号列的情况下将数据插入 MS Access 表?

如何在不将字体转换为轮廓的情况下将 cairo-pdf 转换为 eps

如何在不杀死 /health 的情况下将我的 Spring Boot 应用程序默认为 application/xml?

如何在不将 csv 保存到磁盘的情况下将 csv 格式的数据从内存发送到数据库?

如何在不将 LocalDateTime 字段转换为扩展的 json 对象的情况下将 java 对象转换为简单的 json 字符串?