【问题标题】:Android Widget - Read_SMS permission denied API 23Android Widget - Read_SMS 权限被拒绝 API 23
【发布时间】:2016-06-12 00:16:22
【问题描述】:

我是安卓新手。

我打算做的是获取当前设备短信收件箱内的短信数量。 我希望这个数字出现在文本视图中。

我从其他帖子中了解到 API 23 中的权限机制发生了变化。 但在所有这些帖子中,我们都有一项活动。 在我的情况下,我没有活动,我试图在 AppWidgetProvider 的 onUpdate 方法中获取短信数量。

在我的 Manifest 文件中,我添加了 READ_SMS 的权限。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.globa8track.smsgtw">    
    **<uses-permission android:name="android.permission.READ_SMS"/>**
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver android:name=".smsGtw">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/sms_gtw_info" />
        </receiver>    
    </application>
</manifest>

然后在我的小部件 Java 类上 smsGtw.java

package com.globa8track.smsgtw;

import android.Manifest;
import android.app.DownloadManager;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.RemoteViews;

import java.util.ArrayList;

    public class smsGtw extends AppWidgetProvider {

        void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                             int appWidgetId) {

            ArrayList<String> inboxSms;
            int nrSmsInInbox = 0;


            inboxSms = fetchInbox(context);
            nrSmsInInbox = inboxSms.size();



            CharSequence widgetText = "Gtw Total Sms Received: " + nrSmsInInbox;

            // Construct the RemoteViews object
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.sms_gtw);
            views.setTextViewText(R.id.appwidget_text, widgetText);

            // Instruct the widget manager to update the widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }

        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            // There may be multiple widgets active, so update all of them
            for (int appWidgetId : appWidgetIds) {
                updateAppWidget(context, appWidgetManager, appWidgetId);
            }
        }

        @Override
        public void onEnabled(Context context) {
            // Enter relevant functionality for when the first widget is created
        }

        @Override
        public void onDisabled(Context context) {
            // Enter relevant functionality for when the last widget is disabled
        }


        public static ArrayList<String> fetchInbox(Context context){

            ArrayList<String> sms=new ArrayList<String>();

            Uri uriSms=Uri.parse("content://sms/inbox");

            ContentResolver cr = context.getContentResolver();
            Cursor cursor = cr.query(uriSms, new String[]{"_id", "address", "date", "body"}, null, null, null);
            cursor.moveToFirst();

            while(cursor.moveToNext()){

                String address=cursor.getString(1);
                String body=cursor.getString(3);

                sms.add("Address=>"+address+"\n Sms=>"+body);
            }

            return sms;
        }


    }

当我在 Android Studio 模拟器 (Nexus 5 API 23) 上运行此代码时,我得到了 以下错误:

Process: com.globa8track.smsgtw, PID: 5397 java.lang.RuntimeException: Unable to start receiver com.globa8track.smsgtw.smsGtw: java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/inbox from pid=5397, uid=10057 requires android.permission.READ_SMS, or grantUriPermission()

来自帖子:Why does Android ignore READ_SMS permission?

我知道需要先获得许可,然后再检查该许可。正如@Tomáš Navara 所说。但在他的情况下,有一个活动。

我也必须参加活动吗?我不需要用户交互,也不需要用于检查收件箱中存储的短信数量的用户界面。

另外一件事,你能帮我开始使用 android 小部件世界吗? 我应该从哪里开始? 你能给我一些指针/资源吗? 感谢大家的耐心等待。

【问题讨论】:

  • “我也必须有活动吗?” -- 是的。
  • 你@CommonsWare。所以我必须创建一个活动 SMSRead 由小部件 onUpdate() 通过意图调用?以及如何在小部件的文本视图上打印结果?

标签: android android-widget android-6.0-marshmallow android-permissions


【解决方案1】:

所以我必须创建一个由小部件 onUpdate() 通过意图调用的活动 SMSRead?

没有。您现有的代码可以(大概)用于获取消息和更新应用程序小部件。如果它适用于较旧的设备,并且如果它适用于 Android 6.0(如果您通过应用程序的“设置”屏幕手动授予权限,那么就可以了。

您需要活动的地方是能够向用户请求READ_SMS 权限。

因此,在您的应用小部件代码中,您需要调用 ContextCompat.checkSelfPermission() 以查看您是否拥有 READ_SMS 访问权限。如果您确实有权访问,请继续更新您的应用小部件。如果您不这样做,请提出Notification 让用户知道您需要他们授予您权限。理想情况下,Notification 将与您的活动相关联,然后您可以使用ActivityCompat.requestPermissions() 请求READ_SMS

您还可以将该活动设置为您的应用小部件配置活动,当您的应用小部件添加到用户的主屏幕时,该活动会自动启动。这使您可以立即请求许可。但是,您仍然需要在AppWidgetProvider 中调用checkSelfPermission(),因为用户可以通过设置应用撤销权限。

【讨论】:

  • 谢谢@CommonsWare。我向我的小部件添加了一个主要活动,并添加了checkSelfPermissionrequestPermissions。我现在可以在我的小部件上获取收到的短信数量。这个link 对我理解如何请求权限帮助很大。
猜你喜欢
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 2015-12-21
  • 2020-06-03
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多