Ich möchte eine Berechtigung in einem Fragment überprüfen.
Mein Code:
// 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.
}
}
aber onRequestPermissionsResult
nicht aufgerufen nach erlauben oder verweigern.
@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
quelle
quelle
Antworten:
Ich habe Folgendes getan, um eine Berechtigung in einem Fragment zu überprüfen.
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"); }
quelle
So habe ich es gemacht, es funktioniert bei mir. Vielen Dank!
Für Aktivität:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Für Fragment:
requestPermissions(permissionsList, REQUEST_CODE);
quelle
Fragment hat
requestPermissions()
undonRequestPermissionsResult()
Methoden, benutze es.Ist
checkSelfPermission()
aber vonActivityCompat
(nicht erforderlichActivity
, nurContext
).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(); } } }
quelle
So behandeln Sie Berechtigungen in einer
Fragment
AufrufmethoderequestPermissions
. Wenn Sie dieonRequestPermissionsResult
Methode sowohl im Fragment als auchsuper.onRequestPermissionsResult(...)
in der Aktivität überschreiben , die dieses Fragment enthält, stellen Sie sicher, dass Sie die Aktivitätsmethode aufrufen, um den Aufruf an dieonRequestPermissionsResult
Methode im Fragment weiterzugeben.quelle
onRequestPermissionsResult
wird in der Aktivität nicht das Fragment aufgerufen. Versuchen SieonRequestPermissionsResult
stattdessen, die Aktivität zu überschreiben .quelle
onRequestPermissionResult
in Fragmente gerät. Sowohl die Erklärung als auch die Art und Weise, wie das Ergebnis fragmentiert empfangen wird, werden in der Antwort von ThetNaing Mizo erläutert .Mit Kotlin rufen
requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)
Sie die folgende Überschreibung auf und fügen sie Ihrem Fragment hinzuoverride fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit { }
quelle
Für mich hat es funktioniert , die onRequestPermissionsResult- Methode in der Aktivität aufzurufen , in der das Fragment implementiert ist, anstatt es im Fragment selbst aufzurufen. Innerhalb der onCreateView- Methode im Fragment:
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(); } } });
In der Aktivität, die beim Implementieren von Fragmenten außerhalb der onCreate- Methode hilft :
@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; } }
quelle
Wenn Sie Ihre Berechtigung für die App über die Einstellungen geschlossen haben, können Sie Ihre Berechtigung für den Code oder Ihre Android-Version, die niedriger als Marshmallow ist, nicht öffnen.
Sie können diese Dokumentation unter https://developer.android.com/training/permissions/requesting.html überprüfen. Dies ist ein Beispiel unter https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
quelle
Ich war immer mit gestolpert
checkSelfPermission()
in einFragment
und fragen , was der beste Ansatz für sein würde ,Context
ist null (Kotlin spezifisch) ... soll ich verwenden!!
oder etwas anderes ?Ich habe mich für etwas anderes entschieden, das auf Code basiert , den ich in iosched gefunden habe . Werfen Sie einen Blick auf die Probe unten, und denken Sie daran, vor dem
Fragment
zu ein angebracht istActivity
, dieContext
null sein wird.private fun fineLocationPermissionApproved(): Boolean { val context = context ?: return false return PackageManager.PERMISSION_GRANTED == checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) }
quelle