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