Chcę sprawdzić pozwolenie wewnątrz fragmentu.
mój kod:
// 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.
}
}
ale onRequestPermissionsResult
nie wezwany po zezwoleniu lub odmowie.
@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
S.M_Emamian
źródło
źródło
Odpowiedzi:
Wykonałem następujące czynności, aby sprawdzić pozwolenie wewnątrz fragmentu.
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"); }
źródło
Tak właśnie zrobiłem, to działa na mnie. Dzięki!
Do aktywności:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Dla fragmentu:
requestPermissions(permissionsList, REQUEST_CODE);
źródło
Fragment ma
requestPermissions()
ionRequestPermissionsResult()
metody, użyj go.Ale
checkSelfPermission()
jest zActivityCompat
(nie wymagaActivity
, tylkoContext
).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(); } } }
źródło
onRequestPermissionsResult
jest przywoływany w działaniu, a nie we fragmencie.onRequestPermissionsResult
Zamiast tego spróbuj zastąpić działanie.źródło
onRequestPermissionResult
fragment. Zarówno wyjaśnienie, jak i sposób otrzymania wyniku w postaci fragmentarycznej są wyjaśnione w odpowiedzi ThetNaing Mizo .Używając Kotlina, wywołujesz
requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)
i dodajesz następujące nadpisanie do swojego fragmentuoverride fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit { }
źródło
Aby obsłużyć uprawnienia w metodzie
Fragment
wywołaniarequestPermissions
. Jeśli nadpisujeszonRequestPermissionsResult
metodę zarówno we fragmencie, jak i działaniu zawierającym ten fragment, upewnij się,super.onRequestPermissionsResult(...)
że wywołałeś metodę działania, aby propagować wywołanieonRequestPermissionsResult
metody we fragmencie.źródło
U mnie zadziałało wywołanie metody onRequestPermissionsResult w działaniu, w którym zaimplementowany jest fragment, zamiast wywoływania go w samym fragmencie. Wewnątrz metody onCreateView we fragmencie:
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(); } } });
W działaniu, które pomaga zaimplementować fragment, poza metodą 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; } }
źródło
Jeśli zamknąłeś uprawnienia aplikacji w ustawieniach, nie możesz otworzyć pozwolenia z kodu lub wersji Androida niższej niż Marshmallow.
Możesz sprawdzić tę dokumentację https://developer.android.com/training/permissions/requesting.html A to jest przykład https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
źródło
Zacząłem się potykać używając
checkSelfPermission()
w aFragment
i zastanawiałem się, jakie byłoby najlepsze podejście doContext
bycia zerowym (specyficzne dla Kotlina) ... powinienem użyć,!!
czy czegoś innego ?Poszedłem z czymś innym opartym na kodzie, który znalazłem w iosched . Spójrz na poniższy przykład i pamiętaj, że zanim
Fragment
zostanie dołączony do anActivity
,Context
będzie zerowy.private fun fineLocationPermissionApproved(): Boolean { val context = context ?: return false return PackageManager.PERMISSION_GRANTED == checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) }
źródło