web-dev-qa-db-ja.com

Android from AndroidバージョンMarshmallow以降では、電話をかける許可を求める方法は?

Androidから電話をかけようとしていますが、実行時のアクセス許可も設定しています。そして、電話をかけることを許可するかどうかを尋ねます。しかし、許可を押すと、アプリがクラッシュします。

これは私がそれを実装した方法です:

private static final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));

if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
    }
    else
    {
        startActivity(intent);
    }
}
else
{
    startActivity(intent);
}


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

            }
            return;
        }
    }
}

これは私がlogcatで取得するものです:

Java.lang.RuntimeException: Failure delivering result ResultInfo{who=@Android:requestPermissions:, 
     request=1, result=-1, data=Intent { act=Android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} 
     to activity {com.devpost.airway/com.devpost.airway.activities.MainActivity}: 
     Java.lang.NullPointerException: Attempt to invoke virtual method 
     'Java.lang.String Android.content.Intent.toString()' on a null object reference

      at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3733)
      at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3776)
      at Android.app.ActivityThread.-wrap16(ActivityThread.Java)
      at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1412)
      at Android.os.Handler.dispatchMessage(Handler.Java:102)
      at Android.os.Looper.loop(Looper.Java:148)
      at Android.app.ActivityThread.main(ActivityThread.Java:5461)
      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.NullPointerException: Attempt to invoke virtual method 
    'Java.lang.String Android.content.Intent.toString()' on a null object reference
      at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1485)
      at Android.app.Activity.startActivityForResult(Activity.Java:3930)
      at Android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.Java:48)
      at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:75)
      at Android.app.Activity.startActivityForResult(Activity.Java:3890)
      at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:856)
      at Android.app.Activity.startActivity(Activity.Java:4213)
      at Android.app.Activity.startActivity(Activity.Java:4181)
      at com.devpost.airway.activities.MainActivity.onRequestPermissionsResult(MainActivity.Java:140)
      at Android.app.Activity.dispatchRequestPermissionsResult(Activity.Java:6582)
      at Android.app.Activity.dispatchActivityResult(Activity.Java:6460)
      at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3729)
      at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3776) 
      at Android.app.ActivityThread.-wrap16(ActivityThread.Java) 
      at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1412) 
      at Android.os.Handler.dispatchMessage(Handler.Java:102) 
      at Android.os.Looper.loop(Looper.Java:148) 
      at Android.app.ActivityThread.main(ActivityThread.Java:5461) 
      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) 

これはおそらく何が原因ですか?

12
OBX

スタックトレースは、許可フローが正常に機能していることを示しているようですが、onRequestPermissionsResult()からのstartActivityへの呼び出しはクラッシュしています。 Intentに渡すstartActivityは正しく設定されていますか?コードのその部分で設定されているのがわかりません。

ContextCompat.checkSelfPermissionはあなたに代わってSDKバージョンチェックを処理するので、使用できるはずです。

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
    startActivity(intent);
}

ラッピングSDKバージョンチェックコードなしで、単独で。

23
Fabian Tamp

特定の番号を呼び出すIntentを構築する際に、ACTION_CALLではなくACTION_DIALを使用することをお勧めします。 ACTION_DIALを使用すると、ACTION_DIALが既に入力された番号でダイヤラーを開き、さらにユーザーが実際に電話をかけるか、電話をかける前に電話番号を変更するかを決定できるので、アプリに呼び出し許可は必要ありません。

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + "Your Phone_number"));// Initiates the Intent 
startActivity(intent);
21
Abhishek Luthra

IntentonRequestPermissionsResultを作成する必要があります


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PHONE_CALL: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));
                startActivity(intent);
            }
            else
            {

            }
            return;
        }
    }
} 
5
Tin Tran

新しいメソッドを追加

public static boolean hasPermissions(Context context, String... permissions) {
if (Android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
    for (String permission : permissions) {
        if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
}
return true;
}

これをグローバルに追加

int PERMISSION_ALL = 1; 
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE};

onCreateで以下のコードを記述します

if(!hasPermissions(this, PERMISSIONS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
1
Ganesh Pokale

onRequestPermissionsResultを以下に変更します。基本的には最初にintentを作成し、許可が与えられたら呼び出します。それはあなたがそれを間違っているところです。

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PHONE_CALL : {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));

                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                    startActivity(intent);
                }
            }
        }
    }
}
0
himanshu1496