首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >短信接收通知

短信接收通知
EN

Stack Overflow用户
提问于 2016-07-04 15:49:57
回答 2查看 94关注 0票数 0

我正在编写一个安卓应用程序(API 15,抱歉,出于兼容的原因,我无法克服这个问题),它应该收到一条短信,并显示吐司/弹出。这个应用程序将有设置和/或日志记录的标准活动,但传入的短信也应在后台接收。

我在谷歌上搜索了几个代码,这些代码应该能按我的需要工作,但不幸的是,它不起作用。

以下是我在清单文件中添加的条目:

代码语言:javascript
复制
<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课程:

代码语言:javascript
复制
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的代码,但是,到目前为止,这还没有涉及到短信管理。

我在哪里失败了?

请注意,SMSListener代码似乎没有运行。如果我试着调试它的线程,因为它从未被触发,所以保持“挂起”。事实上,没有在logcat中转储日志行。

我注意到在logcat中我收到了这样的警告:

代码语言:javascript
复制
07-05 17:05:35.293 8277-8277/com.bananainc.smsmirror W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)

也许很重要。

顺便说一下,我在Windows10Home 64位下运行Android Studio 2.1.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-04 16:00:18

将此权限添加到您的清单中:

代码语言:javascript
复制
<uses-permission android:name="android.permission.READ_SMS" />

如果你正在使用android,只需在你的活动中写下你想要的短信吐司。

代码语言:javascript
复制
 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);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-07-05 15:21:12

该问题与应用程序权限有关,但不需要Drv的所有代码(对不起)。在我缺乏经验的情况下,我认为通过ADB安装的应用程序在默认情况下应该设置所有必需的权限(当然,出于安全原因等原因,这是不正确的)。设置权限槽应用程序经理修复了问题。谢谢大家。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38188501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档