Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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
Android SmsReceiver适用于API 21和早期版本,但不适用于API 26_Android_Sms - Fatal编程技术网

Android SmsReceiver适用于API 21和早期版本,但不适用于API 26

Android SmsReceiver适用于API 21和早期版本,但不适用于API 26,android,sms,Android,Sms,所以,我试图写一个应用程序,将发送短信,接收和查看已发送的消息。到目前为止,我可以发送消息,但接收消息在API 26上不起作用。我的下一个仿真器是API21,在该版本上,当收到消息时,会显示Toast消息 我已成功管理发送和接收sms消息所需的权限 我读了一些文档,但找不到我需要的。如果有人知道问题出在哪里,我会感谢他的帮助 公共类SmsReceiver扩展了BroadcastReceiver{ private static final String TAG = "SmsReceiver";

所以,我试图写一个应用程序,将发送短信,接收和查看已发送的消息。到目前为止,我可以发送消息,但接收消息在API 26上不起作用。我的下一个仿真器是API21,在该版本上,当收到消息时,会显示Toast消息

我已成功管理发送和接收sms消息所需的权限

我读了一些文档,但找不到我需要的。如果有人知道问题出在哪里,我会感谢他的帮助

公共类SmsReceiver扩展了BroadcastReceiver{

private static final String TAG = "SmsReceiver";

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

    Bundle bundle = intent.getExtras();

    if(bundle != null) {
        Object[] pdus = (Object[]) bundle.get("pdus");
        SmsMessage[] messages = new SmsMessage[pdus.length];
        String message = "";

        for(int i = 0; i < pdus.length; i++) {
            messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            if(i == 0) {
                message += messages[i].getOriginatingAddress() + ": ";
            }
            message += messages[i].getMessageBody();
            Toast.makeText(context, message, Toast.LENGTH_LONG).show();
        }
    }
}
}

清单文件

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <receiver android:name="package.name"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

我希望这足够了,如果需要,我可以提供其他类或清单文件。提前感谢

您必须使用以下伪代码获得用户在运行时的权限:

public static void requestPermissionForReadSMS(Fragment fragment) {
        if (fragment.shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {
            Helpers.showRequestPermissionAlertDialog(fragment, fragment.getString(R.string.read_sms_permission), fragment.getString(R.string.permission_request));

        } else {
        fragment.requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS},
                Constants.READ_SMS_PERMISSION);
        }

}
在那之后,你的广播接收机就可以工作了

此外,您还可以将广播_短信添加到清单中的接收者标签:

<receiver android:name="packagename.SmsReceiver"
    android:exported="true"
    android:permission="android.permission.BROADCAST_SMS">
    <intent-filter
        android:priority="4876123720">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

此外,您还可以阅读官方文件提供的api witch,用于在您的应用程序中接收短信

我完全没有抓住问题的关键。产生错误行为的错误与接收消息的意图有关。我认为我可以使用相同的意图来打印发送的消息和接收消息。最后,当我创建用于接收sms的自定义意图时,它成功了。

请检查您是否确实正确处理了权限?您是否在运行时明确请求接收短信?请通过您的问题向我们显示清单中的条目以及运行时权限请求代码。我添加了您希望看到的清单代码,谢谢。好的,那么您还没有执行任何运行时权限请求吗?由于棉花糖,运行时也必须请求危险的权限。所有的SMS权限都是危险的,因此您需要请求这些权限,而且由于Oreo,您必须明确请求所需的每个权限,但是有一些简单的例子说明了如何一次请求所有这些,以及如何从请求中接收结果。我确实允许权限,如果有任何进展,将进行更新。抱歉,这并不能解决问题。有些字符串无法定义。我相信这些都是为了得到许可。无法解析else块和中的读取权限常量。无法识别showRequestPermissionAlertDialog