web-dev-qa-db-ja.com

Android 8では、SmsManager.sendTextMessage()を呼び出すときにREAD_PHONE_STATEが必要です

アプリケーションが新しいAndroid 8アップデートでSMSを送信できません。READ_PHONE_STATEがないというエラーが表示されます)許可。

Java.lang.SecurityException: Neither user 10179 nor current process has Android.permission.READ_PHONE_STATE.
    at Android.os.Parcel.readException(Parcel.Java:1942)
    at Android.os.Parcel.readException(Parcel.Java:1888)
    at com.Android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.Java:789)
    at Android.telephony.SmsManager.sendTextMessageInternal(SmsManager.Java:329)
    at Android.telephony.SmsManager.sendTextMessage(SmsManager.Java:312)
    at com.cordova.plugins.sms.Sms.send(Sms.Java:192)
    at com.cordova.plugins.sms.Sms.access$400(Sms.Java:22)
    at com.cordova.plugins.sms.Sms$1.run(Sms.Java:102)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1162)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:636)
    at Java.lang.Thread.run(Thread.Java:764)

通常、この種のエラーは問題ありません-許可が必要であることを理解し、それを要求します。しかし、この場合、SmsManagerを使用するために必要なドキュメントREAD_PHONE_STATEが見つかりません。ここでは sendTextMessage も新しいAndroid 8 pdate notes 。でもありません。後者はhardware serialを取得することについて言及しています) number私はREAD_PHONE_STATE権限が必要になりました。

さらに調査したところ、他の多くの人がこの問題に遭遇したことがわかりましたが、上記の許可を求める以上の詳細や解決策はありません。

そこで、今日はSEND_SMS権限を要求してSMSを送信するだけの単純な純粋なアプリケーションで問題を再現しました。まったく同じ問題が発生しました。 Android 8.以下のすべてで機能しますが、Android 8.で権限エラーが発生してクラッシュします。これを再作成したい場合のソースコードを次に示します。

compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
  applicationId "com.example.usr.smstest"
  minSdkVersion 21
  targetSdkVersion 26
}
package com.example.usr.smstest;

import Android.Manifest;
import Android.content.pm.PackageManager;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.content.ContextCompat;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.telephony.SmsManager;

public class MainActivity extends AppCompatActivity {

    private static final int MY_PERMISSIONS_REQUEST_SEND_SMS = 1;

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    sendSms();
                }
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.SEND_SMS)
                != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.SEND_SMS},
                        MY_PERMISSIONS_REQUEST_SEND_SMS);
        }else{
            sendSms();
        }
    }

    private void sendSms(){
        SmsManager manager = SmsManager.getDefault();
        manager.sendTextMessage("22222222", null, "msg", null, null);
    }

}

google issue tracker に送信しました

22

これはAndroid Oのバグです。非常に煩わしいものです。チェックすると SmsManager.Java 必要なgetSubscriptionIdメソッドが表示されますREAD_PHONE_STATE_PERMISSIONと指定しない場合はREAD_PHONE_STATEスローSecurityException

だからあなたができることはREAD_PHONE_STATE Googleデベロッパーから警告を受けた場合や修正を待つ場合は、Playストアに説明してください

3
Radesh