当前位置: 首页 > 知识库问答 >
问题:

唤醒和铃声报警时收到特定的短信android工作室

耿锦
2023-03-14

我正在制作一个应用程序,可以发送特定的短信到用户选择的所有联系人,只需点击按钮。

接收器还将在手机上安装该应用程序。当安装了该应用程序的手机收到该特定短信时,他们会收到报警对话框,并从资产文件夹播放音频。(即使手机已锁定或处于睡眠状态,或应用程序未运行[即使最近的应用程序已清除])

我已经成功地通过点击向所有choosen联系人发送短信。还可以通过阅读短信来报警。我的问题是,。。。。。只有在应用程序运行时,警报才会起作用。当手机处于锁定状态,或处于睡眠状态,甚至是在最近的应用程序中,应用程序都无法工作。我已经搜索过该功能应该使用的服务。请帮帮我。

这是我的主要活动。JAVA

public class MainActivity extends AppCompatActivity {

    EditText e1, e2;
    Button b1;
    private final static int SEND_SMS_PERMISSION_REQ=1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=findViewById(R.id.editText);
        e2=findViewById(R.id.editText2);
        b1=findViewById(R.id.button);
      
        b1.setEnabled(false);
       

      

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.RECEIVE_SMS)
                !=PackageManager.PERMISSION_GRANTED){
            requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},1000);
        }

        if(checkPermission(Manifest.permission.SEND_SMS))
        {
            b1.setEnabled(true);
        }
        else
        {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, SEND_SMS_PERMISSION_REQ);
        }
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s1=e1.getText().toString();
              //  String s2=e2.getText().toString();
                  String s2="SMSBOOM";
                if(!TextUtils.isEmpty(s1)&&!TextUtils.isEmpty(s2))
                {

                    if(checkPermission(Manifest.permission.SEND_SMS))
                    {
                        SmsManager smsManager=SmsManager.getDefault();
                        smsManager.sendTextMessage(s1,null,s2,null,null);
                    }
                    else {
                        Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
                    }
                }
                else
                {
                    Toast.makeText(MainActivity.this, "Permission denied", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    private boolean checkPermission(String sendSms) {

        int checkpermission= ContextCompat.checkSelfPermission(this,sendSms);
        return checkpermission== PackageManager.PERMISSION_GRANTED;
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode)
        {
            case SEND_SMS_PERMISSION_REQ:
                if(grantResults.length>0 &&(grantResults[0]==PackageManager.PERMISSION_GRANTED))
                {
                    b1.setEnabled(true);
                }
                break;

            case 1000:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "Permission granted!", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "Permission not granted", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
        }
    }
}

这是我的听筒课

public class ReceiveSms extends BroadcastReceiver {



    @Override
    public void onReceive(Context context, Intent intent) {

        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
            Bundle bundle = intent.getExtras();
            SmsMessage[] msgs;
            String msg_from;
            if(bundle != null){
                try{
                    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]);
                        msg_from = msgs[i].getOriginatingAddress();
                        String msgBody = msgs[i].getMessageBody();

                    //https://stackoverflow.com/questions/14093404/android-alarmmanager-or-service

                        if(msgBody.equals("SMSBOOM")){
                            Toast.makeText(context, "From: "+msg_from + ", Msg: "+msgBody, Toast.LENGTH_SHORT).show();
                            this.abortBroadcast();
                            Intent i1 = new Intent(context, RingActivity.class);
                            i1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            i1.putExtra("num", msg_from);
                            i1.putExtra("msg", msgBody);
                            context.startActivity(i1);

                   

                        }

                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }

    }
}

这是我的活动

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_ring);

        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();

        AudioManager am =
                (AudioManager) getSystemService(Context.AUDIO_SERVICE);

        am.setStreamVolume(
                AudioManager.STREAM_MUSIC,
                am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
                0);

      //  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("ringtone.mp3");
                mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                mp.prepare();
                mp.start();
            }
            catch (IllegalStateException | 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("ringtone.mp3");
                mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                mp.prepare();
                mp.start();
            }
            catch (IllegalStateException | IOException e)
            {
                e.printStackTrace();
            }
        }



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

        // Setting Dialog Title
        alertDialogBuilder.setTitle("New SMS Boom");

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




        alertDialogBuilder.setNegativeButton("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;
    }


}

有没有这样做的想法?请帮助............

共有1个答案

毕和志
2023-03-14

我知道了。在android 10或更高版本中,您需要在AndroidManifest中添加SYSTEM_ALERT_WINDOW权限。xml

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

根据官方留档https://developer.android.com/guide/components/activities/background-starts

 类似资料:
  • 本文向大家介绍android获取情景模式和铃声 实现震动、铃声提醒,包括了android获取情景模式和铃声 实现震动、铃声提醒的使用技巧和注意事项,需要的朋友参考一下 当我们想通过铃声或者震动提醒用户的时候(类似于手机来电提醒界面),我们需要考虑到手机本身的情景模式。(目前有个OPPO的测试手机就发现,即使调为了静音模式,我依旧可以将铃声播放出来),为了防止“灵异”事件的发生,所以在提示前将情景模

  • 下面我们来看看睡眠和醒来的基本模型。假设有两个系统调用作为睡眠和唤醒。呼叫睡眠的过程将被阻止,而调用的过程将被唤醒。 有一个叫做生产者消费者问题的流行例子,它是模拟睡眠和唤醒机制的最流行的问题。 睡眠和觉醒的概念非常简单。如果关键部分不是空的,那么该过程将进入休眠状态。它将被临界区内正在执行的其他进程唤醒,以便进程可以进入临界区。 在生产者消费者问题中,让我们说有两个过程,一个过程写某事,而另一个

  • 本文向大家介绍Android BroadcastReceiver接收收到短信的广播,包括了Android BroadcastReceiver接收收到短信的广播的使用技巧和注意事项,需要的朋友参考一下 一、知识介绍   1、broadcastReceiver是广播接受者,四大组件之一。   2、Android中内置了很多系统级别的广播,可以在应用程序中得到各种系统的状态信息。   3、使用场景:  

  • 问题内容: 我正在编写Java客户端(在weblogic 10.3上)以调用安全的Web服务。我已获得安装在cacerts,DemoIdentity.jks和DemoTrust,jks中的客户端证书。在我的Weblogic中,我已将密钥库设置为DemoIdentity和DemoTrust。在weblogic控制台中,我已将“双向客户端证书行为:”设置为“已请求但未强制执行的客户端证书”。对于“启用

  • 本文向大家介绍Android自定义View 实现闹钟唤起播放闹钟铃声功能,包括了Android自定义View 实现闹钟唤起播放闹钟铃声功能的使用技巧和注意事项,需要的朋友参考一下 先上图看一下闹钟唤期页面的效果 实现的功能: 1:转动的图片根据天气情况更换 2:转动时间可以设置,转动结束,闹铃声音就结束 3:光圈颜色渐变效果 直接上代码啦: 以上所述是小编给大家介绍的Android自定义View