Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 广播接收器在后台不工作_Java_Android_Android Studio - Fatal编程技术网

Java 广播接收器在后台不工作

Java 广播接收器在后台不工作,java,android,android-studio,Java,Android,Android Studio,我正在创建一个应用程序,可以检测输入短信到android手机,但应用程序在后台不工作 这是我的mainactivity.java,我在其中请求用户允许访问sms package com.example.times; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import

我正在创建一个应用程序,可以检测输入短信到android手机,但应用程序在后台不工作

这是我的mainactivity.java,我在其中请求用户允许访问sms

package com.example.times;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Switch;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int READ_SMS_PERMISSION=0;

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

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED)
        {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS))
            {
//                do nothing
            }
            else
            {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, READ_SMS_PERMISSION);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
    {
        switch(requestCode)
        {
            case READ_SMS_PERMISSION:
            {
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
                {
                    Toast.makeText(this, "Thankyou for granting access", Toast.LENGTH_LONG).show();


                }
                else
                {
                    Toast.makeText(this, "No problem", Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}
这里是myreciver.java,我在其中检测到输入sms并对该消息进行吐司

当应用程序被打开,然后它是正常工作,但当我退出应用程序,它没有检测到任何短信

package com.example.times;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

    private static final String SMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG="SmsBroadcastReceiver";

    String msg, phoneNo ="";


    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
//        throw new UnsupportedOperationException("Not yet implemented");

        Log.i(TAG, "Intent Received: " +intent.getAction());


        if (intent.getAction()==SMS_RECEIVED)
        {
            Bundle dataBundle = intent.getExtras();
            if (dataBundle!=null)
            {
                Object[] mypdu=(Object[])dataBundle.get("pdus");
                final SmsMessage[] message = new SmsMessage[mypdu.length];

                for (int i =0; i<mypdu.length; i++)
                {
                    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M)
                    {
                        String format= dataBundle.getString("format");
                        message[i] = SmsMessage.createFromPdu((byte[])mypdu[i],format);

                    }
                    else
                    {
                        message[i] = SmsMessage.createFromPdu((byte[]) mypdu[i]);
                    }

                    msg =message[i].getMessageBody();
                    phoneNo= message[i].getOriginatingAddress();
                }
                Toast.makeText(context, "Message: " +msg +"\nNumber: " +phoneNo, Toast.LENGTH_SHORT).show();
            }
        }
    }
}

告诉我我是否做错了什么。

确保你的Android Mainfest.xml中有这些

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
以及以下

<receiver
    android:name=
        "com.example.times.MyReceiver"
    android:enabled="true"
    android:exported="true">
</receiver>
编辑 当你的应用程序关闭或处于后台时,你需要一个意向服务来阅读短信。

步骤:

创建意图服务 添加它的清单 通过Intent从广播接收器onReceive方法调用它
您如何确定它没有检测到任何短信?你只是去祝酒吗?您是否检查过onReceive是否正在运行?这就是你的接受者应该做的,还是你删掉了别的什么?您是在模拟器上测试,还是在物理设备上测试?如果是后者,那是哪个特定的设备?你在AndroidManifest中添加了接收器了吗?我的意思是说我的应用程序在后台不工作,制造商的设备通常有安全限制,除了正常的权限之外,这些限制阻止大多数第三方应用程序做某些事情,而用户没有明确允许。你需要找到这些设置,并确保你的应用是允许的。我从来没有使用过这样的设备,所以我不能告诉你具体去哪里,但看看这些帖子:,我发现,这是我的设备问题,它不允许应用程序在后台运行。谢谢你的帮助,先生。谢谢你的帮助,但我想说的是,我希望我的应用程序在后台运行。当应用程序打开时它工作,但当应用程序关闭时它不工作。你需要intent服务。你已经走到一半了。只需添加意向服务和您的良好状态即可。查看此链接我也尝试过,但当应用程序关闭时它不起作用。如果你高于android P,那么你需要WorkManager。看看这个。