Quero verificar uma permissão dentro de um fragmento.
meu código:
// 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.
}
}
mas onRequestPermissionsResult
não chamado após permitir ou negar.
@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
fonte
fonte
Respostas:
Eu fiz o seguinte para verificar uma permissão dentro de um fragmento.
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"); }
fonte
É assim que eu fiz, funciona para mim. Obrigado!
Para atividade:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Para Fragmento:
requestPermissions(permissionsList, REQUEST_CODE);
fonte
Fragment tem
requestPermissions()
eonRequestPermissionsResult()
métodos, use-o.Mas
checkSelfPermission()
é deActivityCompat
(não requerActivity
, apenasContext
).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(); } } }
fonte
Para lidar com permissões em um método de
Fragment
chamadarequestPermissions
. Se você substituir oonRequestPermissionsResult
método no fragmento e na atividade, contendo esse fragmento, certifique-se de chamarsuper.onRequestPermissionsResult(...)
o método de atividade para propagar a chamada para oonRequestPermissionsResult
método no fragmento.fonte
onRequestPermissionsResult
é invocado na atividade, não no fragmento.onRequestPermissionsResult
Em vez disso, tente substituir na atividade.fonte
onRequestPermissionResult
no fragmento. Tanto a explicação quanto a forma de recebimento do resultado são fragmentadas são explicadas na resposta de ThetNaing Mizo .Usando Kotlin, você chama
requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)
e adiciona a seguinte modificação ao seu fragmentooverride fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit { }
fonte
O que funcionou para mim foi chamar o método onRequestPermissionsResult na atividade dentro da qual o fragmento é implementado, em vez de chamá-lo no próprio fragmento. Método interno onCreateView no fragmento:
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(); } } });
Na Activity que ajuda a implementar o fragmento, fora do método 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; } }
fonte
Se você fechou a permissão do aplicativo nas configurações, não poderá abrir a permissão do código ou sua versão do Android anterior ao Marshmallow.
Você pode verificar esta documentação https://developer.android.com/training/permissions/requesting.html E este é um exemplo https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
fonte
Eu estava me perdendo ao usar
checkSelfPermission()
umFragment
e me perguntando qual seria a melhor abordagem paraContext
ser nulo (específico do Kotlin) ... devo usar!!
ou outra coisa ?Optei por outra coisa com base no código que encontrei no iosched . Dê uma olhada no exemplo abaixo e lembre-se, antes de
Fragment
ser anexado a umActivity
, oContext
será nulo.private fun fineLocationPermissionApproved(): Boolean { val context = context ?: return false return PackageManager.PERMISSION_GRANTED == checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) }
fonte