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)
これはおそらく何が原因ですか?
スタックトレースは、許可フローが正常に機能していることを示しているようですが、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バージョンチェックコードなしで、単独で。
特定の番号を呼び出す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);
Intent
にonRequestPermissionsResult
を作成する必要があります
@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;
}
}
}
新しいメソッドを追加
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);
}
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);
}
}
}
}
}