0

ボタンのクリックに対してCALL_PHONE権限をリクエストしたカスタムボタンクラスが1つあります。すべては問題ありませんが、onRequestPermissionResult()でユーザ結果を取得していません。ここで私はカスタムボタンクラスを掲示しています。事前の人々でAndroid M権限:onRequestPermissionsResult()がカスタムボタンクラスで呼び出されていない

public class CustomCallExecutiveButton extends Button implements View.OnClickListener, ActivityCompat.OnRequestPermissionsResultCallback { 

Context mContext; 
private Button mCallButton; 
private int REQUEST_CALL = 1; 

public CustomCallExecutiveButton(Context context) { 

    super(context); 
    mContext = context; 
    init(); 
} 

public CustomCallExecutiveButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext = context; 
    init(); 
} 

public CustomCallExecutiveButton(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    mContext = context; 
    init(); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public CustomCallExecutiveButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    mContext = context; 
    init(); 
} 


private void init() { 
    setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 

    CheckCallPermission(); 


} 
public void CheckCallPermission() { 
    // Check if we have write permission 
    int permission = ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE); 
    if (permission != PackageManager.PERMISSION_GRANTED) { 
     requestCameraPermission(); 
    } else { 
     intentToCall(); 
    } 
} 

public void intentToCall() { 
    Intent callIntent = new Intent(Intent.ACTION_CALL); 
    callIntent.setData(Uri.parse("tel:" + "9069118117")); 
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 

     return; 
    } 
    mContext.startActivity(callIntent); 
} 

public void requestCameraPermission() { 

    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext,Manifest.permission.CALL_PHONE)) { 
     openCallPermissionDailog(); 

    } else { 
     openCallPermissionDailog(); 
    } 
} 

public void openCallPermissionDailog() { 

    //Requesting camera and storage permission dailog 
    android.app.AlertDialog.Builder alert = new android.app.AlertDialog.Builder(mContext); 
    alert.setTitle("Permission"); 
    alert.setMessage("Phone State Permission Needed To Make Call."); 
    alert.setPositiveButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 
    alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      //when user clicks on yes onRequestPermissionResult tells whether user granted permission or not. 
      ActivityCompat.requestPermissions((Activity) mContext, 
        new String[]{Manifest.permission.CALL_PHONE}, 
        REQUEST_CALL); 
     } 
    }); 

    alert.show(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 

    if (requestCode == REQUEST_CALL) { 

     if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Camera permission has been granted, preview can be displayed 
      intentToCall(); 
     } 


    } 

} 
} 

感謝:)

答えて

1

私はonRequestPermissionResultでユーザー結果を得ていないのです()

はい、あなたはあります。どの活動がmContextで表されているのかは、onRequestPermissionResult()になります。

IMHO、あなたがしているのは、分離の懸念の違反です。アクティビティーやフラグメントなど、コントローラーのほうが多いものは、ビューではなくパーミッションのチェックと要求を行います。

既存のコードをもっと残しておきたい場合は、onRequestPermissionResult()の結果をビューに転送することを歓迎します。

+0

これは、カスタムクラスで結果を得ることができないことを意味します。カスタムクラスを使用しているすべてのアクティビティでonRequestPermissionResultを実装する必要があります。 – Arora

関連する問題