0

У меня есть один пользовательский класс кнопки, в котором я запросил разрешение CALL_PHONE при нажатии кнопки. Все в порядке, но я не получаю результат пользователя 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()

Да, вы. Это будет onRequestPermissionResult() любой деятельности, представленной mContext.

ИМХО, то, что вы делаете, является нарушением разделения интересов. Что-то, что является скорее контроллером, таким как активность или фрагмент, отвечает за проверку и запрос разрешений, а не за представление.

Если вы хотите сохранить свой существующий код, сообщите нам об этом onRequestPermissionResult().

+0

Это означает, что я не могу получить результат в моем пользовательском классе. Мне нужно реализовать onRequestPermissionResult во всех действиях, в которых я использую свой собственный класс. – Arora

Смежные вопросы