Как проверить разрешение в фрагменте
Я хочу проверить разрешение внутри фрагмента.
мой код:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
android.Manifest.permission.ACCESS_FINE_LOCATION)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
1);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
но onRequestPermissionsResult
не onRequestPermissionsResult
после разрешения или onRequestPermissionsResult
.
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
Log.e("test","0");
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
//yes
Log.e("test","1");
Intent intent = new Intent(getActivity(), MapsActivity.class);
intent.putExtra("latitude", 35.694828);
intent.putExtra("longitude", 51.378129);
startActivity(intent);
} else {
utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty),
r.getString(R.string.str_you_must_allow_this_permission_toast),
r.getString(R.string.str_warning_btn_login));
Log.e("test","2");
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
Ответы
Ответ 1
Я сделал следующее, чтобы проверить разрешение внутри фрагмента.
if (ActivityCompat.checkSelfPermission(getContext(),
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(getContext(),
android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOCATION);
} else {
Log.e("DB", "PERMISSION GRANTED");
}
Ответ 2
Так я и сделал, это работает для меня. Благодарю!
Для деятельности:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Для фрагмента:
requestPermissions(permissionsList, REQUEST_CODE);
Ответ 3
Фрагмент имеет requestPermissions()
и onRequestPermissionsResult()
, используйте его.
Но checkSelfPermission()
- из ActivityCompat
(не требует Activity
, только Context
).
if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions( //Method of Fragment
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS_CODE_WRITE_STORAGE
);
} else {
downloadImage();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) {
if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
proceedWithSdCard();
}
}
}
Ответ 4
onRequestPermissionsResult
вызывается в активности, а не фрагменте. onRequestPermissionsResult
попробуйте переопределить onRequestPermissionsResult
.
Ответ 5
Используя Kotlin, вы вызываете requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)
и добавляете следующее переопределение к вашему фрагменту
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit {
}
Ответ 6
Если вы закрыли свое разрешение приложения из настроек, вы не сможете открыть свое разрешение от кода или вашей версии Android ниже, чем Marshmallow.
Вы можете проверить эту документацию https://developer.android.com/training/permissions/requesting.html И это пример https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
Ответ 7
Для меня работало то, что я вызывал метод onRequestPermissionsResult в действии, внутри которого реализован фрагмент, а не вызывал его в самом фрагменте. Внутри метода onCreateView во фрагменте:
Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
}else{
//Do your work
fetchMethod();
}
}
});
В Activity, которая помогает реализовать фрагмент, вне метода onCreate:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_MEDIA:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
fetchMethod();
}else{
Toast.makeText(getApplicationContext(), "Permission not granted!", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
Ответ 8
Для обработки разрешений в методе вызова Fragment
requestPermissions
. Если вы переопределяете метод onRequestPermissionsResult
как во фрагменте, так и в onRequestPermissionsResult
, содержащем этот фрагмент, обязательно вызовите super.onRequestPermissionsResult(...)
в методе действия для onRequestPermissionsResult
методу onRequestPermissionsResult
во фрагменте.