注册 BroadcastReceiver 时 returns Intent = null (Android 6.0)

When register BroadcastReceiver it returns Intent = null (Android 6.0)

我是这个 Android 的新手,并且真的坚持了下来..

从来没有像那样 - 在开始级别并且已经卡住了。

当注册接收器时class它returns Intent = null.. 意味着它对这样的请求(Action,Intent)一无所知..

在 Nexus 模拟器 + 三星设备 NOTE4 上测试。结果相同。

请帮帮我。我还没有看到什么棘手的事情?

一般activity

public class MainActivity extends AppCompatActivity {
    EventBroadcaster sms;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent ret;
        sms = new EventBroadcaster();
        sms.setMainActivity(this);
        sms.say("Hello from EventBroadcaster");
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        //filter.addCategory(Intent.CATEGORY_DEFAULT);
        ret = registerReceiver(sms, filter);
        //******************************************//
        if (ret == null) {
            sms.say("Fault to activate Broadcaster.. Intent = null");
        }
    }

    public void showToast(String message){
        // Show Alert
        int duration = Toast.LENGTH_LONG;
        Toast toast = Toast.makeText(getApplicationContext(), message, duration);
        toast.show();
    }
}

广播接收器

public class EventBroadcaster extends BroadcastReceiver {
    MainActivity ma;
    public void setMainActivity(MainActivity context) {
        ma = context;
        say("MainActivity reference is received");
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        say("Notification received");
    }

    public void say(String phrase){
        ma.showToast(phrase);
    }
}

清单

<manifest ...>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

============================================= =

所以,在 Vishnu 回答之后,我认为放置 一般Activity

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import android.provider.Telephony;

public class MainActivity extends AppCompatActivity {
    EventBroadcaster sms;
    final int MY_PERMISSIONS_REQUEST_READ_SMS = 100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sms = new EventBroadcaster();
        sms.setMainActivity(this);
        sms.say("Hello from EventBroadcaster");

    if (VERSION.SDK_INT <= 23) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECEIVE_SMS},
                MY_PERMISSIONS_REQUEST_READ_SMS);
    }
    else if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED ){
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECEIVE_SMS},
                MY_PERMISSIONS_REQUEST_READ_SMS);
    } else { /*Permission granted*/ }

    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        Intent ret;
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_SMS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    IntentFilter filter = new IntentFilter();
                    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
                    ret = registerReceiver(sms, filter);
                    if (ret != null) {
                        sms.say("Permission to READ SMS granted");
                    }

                } else {
                    sms.say("Ooops, no permission to READ SMS");
                }
                return;
            }
        }
    }

    public void showToast(String message){
        // Show Alert
        int duration = Toast.LENGTH_LONG;
        Toast toast = Toast.makeText(getApplicationContext(), message, duration);
        toast.show();
    }
}

尝试在您的清单上声明接收者

<receiver
        android:name="com.example.EventBroadcaster"
        android:exported="true" >
        <intent-filter android:priority="1000" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
 </receiver>

针对 Android 6.0 及更高版本的应用需要处理 运行 次权限。 请参阅 Android 文档 Requesting Permissions at Run Time 我想,这可能是原因。