在 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中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • 自定义选择器活动:SecurityException UID n 无权 content:// uri

    我正在构建一个选择器应用程序来替换本机 Android 共享对话框 它工作正常 除非我尝试通过长按图像 gt 共享图像从 Chrome 共享图像 我发现 Google 没有捕获异常 它崩溃了 所以我可以通过 Logcat 查看它 在 Goo
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • Camera.open()返回NULL Android开发

    我正在按照构建相机应用程序的教程进行操作http developer android com tools device html http developer android com tools device html我对 Camera o
  • Android Studio:未找到 Gradle DSL 方法:“classpath()”

    首先 我已阅读所有其他解决方案帖子以及有关迁移到 1 0 的官方文档 到目前为止 还没有任何效果 Error Error 23 0 Gradle DSL method not found classpath Possible causes
  • 如何在TableLayout中创建三列

    我正在开发一个使用的屏幕TableLayout 在这里我可以轻松创建两列 但我怎样才能创建三列呢 这里有一个例子
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 菜单在片段的 onCreateOptionsMenu 处多次膨胀调用

    我使用 Fragments 当我切换到嵌套 Fragment 时 它实现了public void onCreateOptionsMenu Menu menu MenuInflater inflater 当我到达该嵌套片段时 我的菜单会多次膨
  • 在 React Native 中调试应用程序崩溃

    我是 React Native 新手 我正在尝试安装 React Native Facebook SDK 以便我可以使用我的应用程序进行 Facebook 登录 我按照此处列出的步骤操作 https tylermcginnis com in
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 如何在 Viewpager 中禁用预加载下一页? [复制]

    这个问题在这里已经有答案了 如何在 Viewpager 中禁用页面预加载 I tried viewPager setOffscreenPageLimit 0 但它不起作用 用这个viewPager setOffscreenPageLimit
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • Android应用程序可以像旧的普通java小程序一样嵌入到网页中吗?

    我对 android 平台一无所知 也无法在互联网上找到这个基本问题的答案 更新 好的 我本身无法嵌入 Android 应用程序 但是我可以在 Android Webbrowser 中嵌入 Java 的东西吗 不可以 您无法将 Androi

随机推荐