requestpermissions onrequestpermissionsresult example java android android-6.0-marshmallow

java - example - Android M onRequestPermissionsResult in non-Activity



onrequestpermissionsresult example (4)

1- crear una actividad transparente

<activity android:name=".activity.activity.CheckStoragePermissionsActivity" android:theme="@style/Theme.Transparent"> <style name="Theme.Transparent" parent="Theme.AppCompat"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">false</item> </style>

2- Personaliza tu actividad.

public class CheckStoragePermissionsActivity extends AppCompatActivity { private String[] permissions; private int pCode = 12321; public static PermissionListener permissionListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); checkPermissions(); } private void checkPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; boolean flag = false; for (String s : permissions) if (checkSelfPermission(s) != PackageManager.PERMISSION_GRANTED) flag = true; if (flag) { requestPermissions(permissions, pCode); } else { permissionListener.permissionResult(true); finish(); } }else finish(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == pCode) { boolean flag = true; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) for (int i = 0, len = permissions.length; i < len; i++) if (grantResults[i] != PackageManager.PERMISSION_GRANTED) flag = false; if (flag) { if (permissionListener != null) permissionListener.permissionResult(true); } else if (permissionListener != null) permissionListener.permissionResult(false); finish(); } } }

3- permissionListener es una interfaz estática y se puede configurar directamente antes de context.startActivity (...), o usar su plan para encontrar el resultado del permiso.

public interface PermissionListener extends Serializable { void permissionResult(boolean hasPermission); }

4- finalmente se llama context.startActivity(new Intent(context, CheckStoragePermissionsActivity.class));

CheckStoragePermissionsActivity hace todo lo necesario y finaliza después de que el usuario permita o niegue la acción.

Tengo una aplicación que necesita encontrar la ubicación del usuario, y la ubicación se recupera en varias clases, así que escribí una clase separada (no una clase de actividad) que recupera la ubicación del usuario usando servicios de ubicación , funciona bien en Android M pero requiere ejecución permisos de tiempo en Android M , quiero verificar los permisos en mi clase de ubicación y sé cómo verificarlos pero no puedo usar el método onRequestPermissionsResult en mi clase de ubicación, porque mi clase de ubicación no se extiende desde ninguna actividad.

Entonces, ¿qué debo hacer para lograr esto? Cualquier ayuda / pista es apreciada Gracias de antemano


Dado que public void onRequestPermissionsResult (int requestCode, String permissions [], int [] grantResults) es un método abstracto de la interfaz ActivityCompat.OnRequestPermissionsResultCallback . Ver la documentacion

Simplemente implementa esta interfaz en la clase requerida y ya está. Por ejemplo

class location implements ActivityCompat.OnRequestPermissionsResultCallback{ }

Ahora solo anula onRequestPermissionsResult ()

@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { // case Statements } }


Le invitamos a llamar a checkSelfPermission() desde una clase que no sea UI, ya que simplemente necesita un Context .

Sin embargo, debe llamar a requestPermissions() en alguna actividad o fragmento. onRequestPermissionsResult() en esa misma actividad o fragmento. Esto no es diferente de llamar a startActivityForResult() e implementar onActivityResult() .

La idea es que solicite el permiso antes de hacer cualquier cosa que involucre a las clases que no pertenecen a la UI que tratan con ubicaciones.


Usted no puede anularlo. Este método solo está disponible para Actividad y Fragmentos. Pero puede crear un método estático dentro de su clase de Ubicación y llamarlo desde el método onRequestPermissionResult anulado de su actividad / fragmento.

He hecho una implementación personalizada para la ubicación combinada con permiso. También puede utilizar una biblioteca llamada Permitir permisos.