Android:java.lang.SecurityException:权限拒绝:

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36618189/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 01:40:54  来源:igfitidea点击:

Android : java.lang.SecurityException: Permission Denial:

javaandroid

提问by Nyerere

I have an android application that i need to receive sms and I found a certain tutorial that teaches how to do that but when I run it & I get android permission exception

我有一个 android 应用程序,我需要接收短信,我找到了一个教如何做到这一点的教程,但是当我运行它时,我得到了 android 权限异常

FATAL EXCEPTION: main Process: androidreceivesms.javapapers.com.smsbroadcastreceiver, PID: 12206 java.lang.RuntimeException: Unable to start activity ComponentInfo{androidreceivesms.javapapers.com.smsbroadcastreceiver/androidreceivesms.javapapers.com.smsbroadcastreceiver.SmsActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/inbox from pid=12206, uid=10061 requires android.permission.READ_SMS, or grantUriPermission() at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/inbox from pid=12206, uid=10061 requires android.permission.READ_SMS, or grantUriPermission() at android.os.Parcel.readException(Parcel.java:1599) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) at android.content.ContentProviderProxy.query(ContentProviderNative.java:421) at android.content.ContentResolver.query(ContentResolver.java:491) at android.content.ContentResolver.query(ContentResolver.java:434) at androidreceivesms.javapapers.com.smsbroadcastreceiver.SmsActivity.refreshSmsInbox(SmsActivity.java:52) at androidreceivesms.javapapers.com.smsbroadcastreceiver.SmsActivity.onCreate(SmsActivity.java:47) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)? at android.app.ActivityThread.-wrap11(ActivityThread.java)? at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)? at android.os.Handler.dispatchMessage(Handler.java:102)? at android.os.Looper.loop(Looper.java:148)? at android.app.ActivityThread.main(ActivityThread.java:5417)? at java.lang.reflect.Method.invoke(Native Method)? at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)? at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2369) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)?在 android.app.ActivityThread.-wrap11(ActivityThread.java)?在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)?在 android.os.Handler.dispatchMessage(Handler.java:102)?在 android.os.Looper.loop(Looper. 爪哇:148)?在 android.app.ActivityThread.main(ActivityThread.java:5417)?在 java.lang.reflect.Method.invoke(Native Method)?在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)?在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 主要(ActivityThread.java:5417)?在 java.lang.reflect.Method.invoke(Native Method)?在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)?在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 主要(ActivityThread.java:5417)?在 java.lang.reflect.Method.invoke(Native Method)?在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)?在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 调用(本地方法)?在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)?在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 调用(本地方法)?在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)?在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Here is my AndroidManifest.xml file:

这是我的 AndroidManifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".SmsActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver android:name=".SmsBroadcastReceiver" android:exported="true" >
        <intent-filter android:priority="999" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
</application>

Here is my SmsActivity.java

这是我的 SmsActivity.java

public class SmsActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

private static SmsActivity inst;
ArrayList<String> smsMessagesList = new ArrayList<String>();
ListView smsListView;
ArrayAdapter arrayAdapter;

public static SmsActivity instance() {
    return inst;
}

@Override
public void onStart() {
    super.onStart();
    inst = this;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sms);
    smsListView = (ListView) findViewById(R.id.SMSList);
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, smsMessagesList);
    smsListView.setAdapter(arrayAdapter);
    smsListView.setOnItemClickListener(this);

    refreshSmsInbox();
}

public void refreshSmsInbox() {
    ContentResolver contentResolver = getContentResolver();
    Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
    int indexBody = smsInboxCursor.getColumnIndex("body");
    int indexAddress = smsInboxCursor.getColumnIndex("address");
    if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
    arrayAdapter.clear();
    do {
        String str = "SMS From: " + smsInboxCursor.getString(indexAddress) +
                "\n" + smsInboxCursor.getString(indexBody) + "\n";
        arrayAdapter.add(str);
    } while (smsInboxCursor.moveToNext());
}

public void updateList(final String smsMessage) {
    arrayAdapter.insert(smsMessage, 0);
    arrayAdapter.notifyDataSetChanged();
}

public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
    try {
        String[] smsMessages = smsMessagesList.get(pos).split("\n");
        String address = smsMessages[0];
        String smsMessage = "";
        for (int i = 1; i < smsMessages.length; ++i) {
            smsMessage += smsMessages[i];
        }

        String smsMessageStr = address + "\n";
        smsMessageStr += smsMessage;
        Toast.makeText(this, smsMessageStr, Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

}

Here is my SmsBroadcastReceiver.java

这是我的 SmsBroadcastReceiver.java

public class SmsBroadcastReceiver extends BroadcastReceiver {
public static final String SMS_BUNDLE = "pdus";

public void onReceive(Context context, Intent intent) {
    Bundle intentExtras = intent.getExtras();
    if (intentExtras != null) {
        Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
        String smsMessageStr = "";
        for (int i = 0; i < sms.length; ++i) {
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

            String smsBody = smsMessage.getMessageBody().toString();
            String address = smsMessage.getOriginatingAddress();

            smsMessageStr += "SMS From: " + address + "\n";
            smsMessageStr += smsBody + "\n";
        }
        Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();

        //this will update the UI with message
        SmsActivity inst = SmsActivity.instance();
        inst.updateList(smsMessageStr);
    }
}

}

}

Can anyone please help me because i have been stack here for a long time now? Any help will be appreciated thanks

任何人都可以帮助我,因为我已经在这里堆了很长时间了吗?任何帮助将不胜感激谢谢

回答by Alexander

Looks like its because new permissions system in android 6 try to use it before work with sms

看起来是因为 android 6 中的新权限系统尝试在使用 sms 之前使用它

if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) {}

and this if you dont have permissions

如果您没有权限,这

ActivityCompat.requestPermissions(SmsActivity.this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS);

I hope this helps

我希望这有帮助

回答by Yashasvi

If you are running it on marshmallow, you need to request the permission to read the sms at the runtime.

如果你在 marshmallow 上运行它,你需要请求在运行时读取 sms 的权限。

Here's the official doc : http://developer.android.com/training/permissions/requesting.html

这是官方文档:http: //developer.android.com/training/permissions/requesting.html

You have to check the permission using ContextCompat.checkSelfPermissionfunction. Then, if you don't have the permission,

您必须使用ContextCompat.checkSelfPermission功能检查权限。然后,如果你没有权限,

request it via ActivityCompat.requestPermissionsmethod and implement

通过ActivityCompat.requestPermissions方法请求并实现

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)method to receive the user results.

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)方法来接收用户结果。