Ich möchte eine Erlaubnis in einem Fragment prü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
wird nicht nach allow oder deny aufgerufen.
@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
}
}
Ich habe folgendes getan, um eine Erlaubnis 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");
}
So habe ich es gemacht, es funktioniert für mich. Vielen Dank!
Für Aktivität:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Für Fragment:
requestPermissions(permissionsList, REQUEST_CODE);
Fragment hat requestPermissions()
und onRequestPermissionsResult()
Methoden, benutze es.
checkSelfPermission()
ist jedoch von ActivityCompat
(nicht Activity
erforderlich, nur 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
wird in der Aktivität nicht im Fragment aufgerufen. Versuchen Sie stattdessen, onRequestPermissionsResult
in der Aktivität zu überschreiben.
Mit Kotlin rufen Sie requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)
auf und fügen Ihrem Fragment die folgende Überschreibung hinzu
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit {
}
Wenn Sie Ihre Erlaubnis für die Anwendung von Einstellungen geschlossen haben, können Sie Ihre Erlaubnis nicht mit Code oder Ihrer Android-Version öffnen, die niedriger als Marshmallow ist.
Sie können diese Dokumentation überprüfen https://developer.Android.com/training/permissions/requesting.html Dies ist ein Beispiel https: //www.learn2crack. de/2015/10/Android-Marshmallow-permissions.html
Was für mich funktionierte, war das Aufrufen der onRequestPermissionsResult - Methode in der activity, in der fragment implementiert ist, anstatt es in fragment selbst aufzurufen. Inside onCreateView in 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 zur Implementierung des Fragments außerhalb der onCreate -Methode beiträgt:
@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;
}
}
Um Berechtigungen in einer Fragment
-Methode zu verarbeiten, rufen Sie requestPermissions
auf. Wenn Sie die Methode onRequestPermissionsResult
sowohl im Fragment als auch in der Aktivität überschreiben, die dieses Fragment enthält, müssen Sie in der Aktivitätsmethode super.onRequestPermissionsResult(...)
aufrufen, um den Aufruf an die Methode onRequestPermissionsResult
im Fragment weiterzuleiten.