在 Android 中执行获取短信中特定文本的操作

2024-01-30

我试图弄清楚如何在 Android 中读取传入的 SMS 消息并执行特定任务,例如,当带有文本“RingAlarm”的 SMS 传入时发出警报。

我想出了使用 BroadcastReciever 类来读取短信,但是当带有预定义文本的消息到达时如何执行特定操作。谁能指导我需要使用哪个类和/或方法以及如何使用?

public class IncomingSms extends BroadcastReceiver {

String key = MainActivity.keyword; //Keyword is a variable in MainActivity.
                       //I guess, my mistake is in accessing this variable in the IncomingSms class.

 @Override
    public void onReceive(Context context, Intent intent) 
    {
        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String sms = null;
        String str = "";      



        if (bundle != null)
        {
            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];            
            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                str += "SMS from " + msgs[i].getOriginatingAddress();                     
                str += " :";
                str += msgs[i].getMessageBody().toString();
                str += "\n";   
                sms = msgs[i].getMessageBody().toString();

            }

            //---display the new SMS message---
            //Toast.makeText(context, str, Toast.LENGTH_SHORT).show();


            //---compare received message with keyword
            if(sms==key)
                {
                  Toast toast = Toast.makeText(context, "Keyword Recieved", Toast.LENGTH_LONG);
                  toast.show();
                }


        }                         
    }

提前致谢!


这是我解决您问题的简单模块。

我们假设关键字是“RING”。

  1. MyReceiver :是一个类文件,用于检测关键字“RING”并启动 RingActivity。

  2. RingActivity :无论您的设备处于静音模式还是振动模式,都会让您的设备响铃。

我的接收者

public class MyReceiver extends BroadcastReceiver
{
    final SmsManager sms = SmsManager.getDefault();
    @Override
    public void onReceive(Context context, Intent intent) 
    {       
        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
        {       
            // Retrieves a map of extended data from the intent.
            final Bundle bundle = intent.getExtras();
            SmsMessage[] msgs = null;
            String str = "";

            try
            { 
                if (bundle != null) 
                {
                    //---retrieve the SMS message received---
                    Object[] pdus = (Object[]) bundle.get("pdus");

                    msgs = new SmsMessage[pdus.length];
                    for (int i = 0; i < msgs.length; i++)
                    {
                        msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                        str += "SMS from " + msgs[i].getOriginatingAddress();
                        str += " :";
                        str += msgs[i].getMessageBody().toString();
                        str += "\n";
                    }
                    String replyPhone = msgs[0].getOriginatingAddress();
                    String request = msgs[0].getMessageBody().toString();

                    if(request.equals("RING"))                      
                    {
                        this.abortBroadcast();
                        Intent i = new Intent(context, RingActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        i.putExtra("num", replyPhone);
                        i.putExtra("msg", request);
                        context.startActivity(i);
                    }
                }
            }
            catch (Exception e) 
            {
                Log.e("MyReceiver", "Exception smsReceiver" +e);

            }
        }//close if
    }//close onReceive();
}

环活动

public class RingActivity extends Activity {

final Context context = this;
MediaPlayer mp = new MediaPlayer();

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Bundle extras = getIntent().getExtras(); 
    String num = extras.getString("num");
    String msg = extras.getString("msg");

    int duration = Toast.LENGTH_LONG;
    Toast toast = Toast.makeText(context, "I AM At Reciver\nsenderNum: "+num+", message: " + msg, duration);
    toast.show();

    SmsManager smsManager = SmsManager.getDefault();
    if(IsRingerSilent() || IsVibrate())
    {
        smsManager.sendTextMessage(num, null, "Device turned to ringing mode.. && It's Ringing..", null, null);
        AudioManager audioManager= (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        mp.setLooping(true);
        try 
        {
            AssetFileDescriptor afd;
            afd = getAssets().openFd("fire_siren.mp3");
            mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            mp.prepare();
            mp.start();
        }
        catch (IllegalStateException e)
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
    else
    {
        smsManager.sendTextMessage(num, null, "Device Ringing...", null, null);
        AudioManager audioManager= (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
        mp.setLooping(true);
        try 
        {
            AssetFileDescriptor afd;
            afd = getAssets().openFd("fire_siren.mp3");
            mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            mp.prepare();
            mp.start();
        }
        catch (IllegalStateException e)
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }



    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

    // Setting Dialog Title
    alertDialogBuilder.setTitle("Device Ringing");

    // Setting Dialog Message
    alertDialogBuilder.setMessage("Sender : "+num+"\n"+"Message : "+msg);




    alertDialogBuilder.setNegativeButton("Dialog Close", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) 
        {
            if(mp.isPlaying())
            {
                mp.setLooping(false);
                mp.stop();
            }
        dialog.cancel();
        finish();
       }
    }); 

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();
    //show dialog
    alertDialog.show();


}

private boolean IsVibrate() 
{
 AudioManager audioManager = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);

     if(audioManager.getRingerMode()==AudioManager.RINGER_MODE_VIBRATE )
     {
         return true;
     }
     else
     {
         return false;
     }      
}

private boolean IsRingerSilent() 
{
    AudioManager audioManager = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);

     if(audioManager.getRingerMode()==AudioManager.RINGER_MODE_SILENT )
     {
         return true;
     }
     else
     {
         return false;
     }
}

public boolean onKeyDown(int keycode, KeyEvent ke)
{
    if(keycode==KeyEvent.KEYCODE_BACK)
    {

        if(mp.isPlaying())
        {
            mp.setLooping(false);
            mp.stop();
        }
        finish();           
    }
    return true;
}


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中执行获取短信中特定文本的操作 的相关文章

  • 意图?如何注册以获得传入电子邮件提醒?

    这里是极限 Android 开发新手 好吧 Android 开发新手 而不是一般开发 我想编写一个应用程序 当电子邮件进入设备时会收到通知 并根据电子邮件中的数据 主题 发件人 收件人等 采取各种操作 我认为我要做的是创建一个带有 Inte
  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • Android向后兼容技术

    我现在在开发基于最新 API 15 ICS 的 15 项活动 Android 应用程序方面取得了进展 现在我发现应用程序的主要功能主义者即使支持 android v4 也不向后兼容 例如 1 fragment事务动画 2 将StringSe
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • Android 中的 java.util.Observable 是线程安全的吗?

    Android 中的 java util Observable 是线程安全的吗 这文档 http developer android com reference java util Observable html说只有deleteObser
  • 如何忽略 LeakCanary 中的某些类?

    有人能给我一个如何忽略 LeakCanary 中的某些类的有效示例吗 我正在查看这个示例 以忽略 LeakCanary 中第三方库中的某些类 但我不知道将其放在应用程序中的何处 我把它放在我的应用程序类中 但这些变量和方法有错误 isInA
  • 我的 Android 设备需要安装哪个驱动程序才能运行我的应用程序?

    我购买了 intex mobile 来在真实设备中测试我的 Android 应用程序 然而 该设备不存在于 OEM USB 驱动程序列表中 android 提供的设备列表中 我检查了 intex 官方网站 但不确定到底需要安装哪个驱动程序
  • 需要在 Android 中伪造正在扫描的 NFC 标签

    好的 我有一个应用程序 此应用程序仅在扫描 NFC 标签 任何标签 时才会完成任务 唯一的问题是 我没有任何 nfc 标签 无论如何 我正试图消除对卡的需要 所以我需要的是一种 伪造 使其看起来 就像已扫描 nfc 标签的方法 我可以编写应
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 将图像保存到内部存储器并将出现在图库中

    我搜索了很多与我的问题相关的问题 是否有办法将图像存储在内存中并且它也应该出现在图库中 这是完全有可能的 我以前也这么做过 在将图像保存到内存 或称为应用程序文件夹等 之前 您最好设置Context MODE WORLDREADABLE 虽
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • 截图显示黑色

    我正在拍摄快照并创建缩略图 然后共享此图像 但缩略图显示全黑 我使用了以下代码 Bitmap bitmap View v1 v getRootView v1 setDrawingCacheEnabled true bitmap Bitmap
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • BitmapFactory.decodeResource() 忽略 jpg 图像的 inPreferredConfig 选项

    我尝试将jpeg资源图像加载到ARGB 8888格式的位图 BitmapFactory Options opts new BitmapFactory Options opts inPreferredConfig Bitmap Config
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player
  • 从 sqlite 和 mysql 加载数据微调器

    我试试这个tutorial http nielpoenya blogspot com 2012 08 tutorial android spinner dari database html加载Spinner from sqlite and

随机推荐