Я хочу проверить разрешение внутри фрагмента.
мой код:
// 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's 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
не вызывается после разрешения или отклонения.
@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
}
}
android
android-fragments
android-permissions
С.М. Эмамян
источник
источник
Ответы:
Я сделал следующее, чтобы проверить разрешение внутри фрагмента.
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"); }
источник
Вот как я это сделал, у меня работает. Благодарность!
Для деятельности:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Для фрагмента:
requestPermissions(permissionsList, REQUEST_CODE);
источник
Фрагмент имеет
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(); } } }
источник
onRequestPermissionsResult
вызывается в действии, а не во фрагменте.onRequestPermissionsResult
Вместо этого попробуйте переопределить действие.источник
onRequestPermissionResult
во фрагмент. Как объяснение, так и способ получения результата во фрагментированном виде объясняются в ответе ThetNaing Mizo .Используя 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 { }
источник
Для обработки разрешений в методе
Fragment
вызоваrequestPermissions
. Если вы переопределяетеonRequestPermissionsResult
метод как во фрагменте, так и в действии, содержащем этот фрагмент, обязательно вызовитеsuper.onRequestPermissionsResult(...)
метод действия, чтобы передать вызовonRequestPermissionsResult
методу во фрагменте.источник
То , что сработало для меня было вызовом 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; } }
источник
Если вы закрыли свое разрешение приложения в настройках, вы не сможете открыть свое разрешение из кода или версию Android ниже, чем Marshmallow.
Вы можете проверить эту документацию https://developer.android.com/training/permissions/requesting.html И это пример https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
источник
Я был сбит с толку, используя
checkSelfPermission()
в a,Fragment
и задавался вопросом, какой будет лучший подход дляContext
нулевого значения (специфично для Kotlin) ... я должен использовать!!
или что-то еще ?Я выбрал что-то еще, основанное на коде, который я нашел в iosched . Взгляните на пример ниже и помните, что до того, как
Fragment
будет прикреплено кActivity
,Context
будет null.private fun fineLocationPermissionApproved(): Boolean { val context = context ?: return false return PackageManager.PERMISSION_GRANTED == checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) }
источник