Ahm*_* Tn 2 sms android broadcastreceiver
我正在尝试构建一个简单的应用程序,它将等待新的SMS到达,从中提取和处理数据.应用程序应该在后台运行.GUI具有单个开关元件以启动/停止广播接收器.即使应用程序被销毁并且屏幕被锁定,应用程序仍应正常工作,除非用户手动将其关闭.我在stackoverflow上搜索了每个资源,并且大多数都是这样做的,然而,它仍然不适合我,我似乎不知道为什么.我知道因为Log.d(...)没有归还任何东西.任何帮助,将不胜感激.
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("RECEIVER", "ENTERED");
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
Log.d("RECEIVER", "SMS RECEIVED");
SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
for(int i = 0; i < 4; i++){
SmsMessage sms = messages[i];
Log.d("Message " + i + 1 + " from: ", sms.getOriginatingAddress());
Toast.makeText(context,"SMS from " + sms.getOriginatingAddress(), Toast.LENGTH_SHORT).show();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
public class MainActivity extends AppCompatActivity {
IntentFilter filter;
SMSReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
receiver = new SMSReceiver();
Switch startSwitch = (Switch) findViewById(R.id.startSwitch);
startSwitch.setChecked(false);
startSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked){
getApplication().registerReceiver(new SMSReceiver(), filter);
} else {
getApplication().unregisterReceiver(receiver);
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ahmad.smsforwarder">
<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>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
小智 6
您必须在AndroidManifest.xml中注册接收器,并在intent过滤器中具有特定意图.
<receiver
android:name=".SMSReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
我不得不发现,从Android 6.0(API 23)开始,您还必须在主活动java类中注册权限.我通过将以下行添加到主活动的类onCreate()方法来解决问题:
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS},1);
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3712 次 |
| 最近记录: |