[英]SMS receive notify
我正在編寫一個Android應用程序( API級別15,抱歉,由於兼容性原因我無法克服這個問題),該應用程序應該會收到一條SMS並顯示吐司/彈出窗口。 此應用將具有用於設置和/或記錄的標准活動,但在后台時也應接收傳入的SMS。
在Google上四處搜尋,發現有幾段代碼可以按我的需要工作,但不幸的是,它卻沒有。
這些是我在清單文件中添加的條目:
<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"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
[...]
<receiver android:name="com.bananainc.smsmirror.SMSListener">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
這是我的SMSListener
類:
public class SMSListener extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
{
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
if (bundle != null)
try {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
String from = msgs[i].getOriginatingAddress();
String body = msgs[i].getMessageBody();
Toast.makeText(context, "SMS" + from + " : " + body , Toast.LENGTH_SHORT).show();
Log.d("EVENT", "SMS" + from + " : " + body);
}
} catch (Exception e) {
Log.d("Exception caught", e.getMessage());
}
}
}
}
當然,我也獲得了用於管理MainActiity
代碼,但是到目前為止,這還不涉及傳入的SMS管理。
我哪里失敗了?
請注意, SMSListener
代碼似乎無法運行。 如果我嘗試調試其線程,請保持“暫停”狀態,因為它永遠不會觸發。 實際上,沒有日志行轉儲到logcat
。
我注意到在logcat中,我得到了以下警告:
07-05 17:05:35.293 8277-8277/com.bananainc.smsmirror W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
也許很重要。
順便說一句,我在Windows 10 Home 64位下運行Android Studio 2.1.2
。
將此權限也添加到您的清單中:
<uses-permission android:name="android.permission.READ_SMS" />
如果您使用的是android-M,則只需在活動中希望短信敬酒的地方寫下以下內容。
final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.RECEIVE_SMS))
permissionsNeeded.add("Receive SMS");
if (!addPermission(permissionsList, Manifest.permission.READ_SMS))
permissionsNeeded.add("Read SMS");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
String message = "You need to grant access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}
});
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
return;
}
private boolean addPermission(List<String> permissionsList, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
}
return true;
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(OtpActivity.this).setMessage(message).setPositiveButton("OK", okListener).setNegativeButton("Cancel", null).create().show();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
Map<String, Integer> perms = new HashMap<String, Integer>();
perms.put(Manifest.permission.RECEIVE_SMS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.READ_SMS, PackageManager.PERMISSION_GRANTED);
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if (perms.get(Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED
) {
} else {
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
該問題與應用程序許可有關,但並不需要Drv提供的所有代碼(對不起)。 以我的經驗,我堅決建議通過ADB安裝的應用應默認設置所有必需的權限(當然,出於安全原因等原因這是不正確的)。 通過應用程序管理器設置權限可以解決此問題。 謝謝任何人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.