Muy bien. Vamos a hacer un ejemplo de cómo manejar el administrador de permisos en nuestros proyectos de Android. A continuación el ejemplo que vamos a hacer es. Vamos a activar el bluetooth de nuestro teléfono. Y entonces este proyecto lo vamos a llamar Activar Blue Tooth. Ahà está, activar bluetooth. Y además vamos a estar manejando la solicitud de permisos dinámicos. Vamos a trabajar en esta API. Vamos a seleccionar un empty activity. Lo único que va a tener nuestro proyecto es un único botón que diga activar bluetooth. Entonces algo que quiero mencionarles. Es que este proyecto únicamente lo vamos a poder probar en nuestro teléfono, en nuestro dispositivo. Entonces para eso yo he instalado una aplicación que ahorita lo único que está haciendo es estar grabando mi teléfono. Esta aplicación se llama Vysor (Beta). Entonces lo único que hace esta aplicación es estar grabando todo lo que mi pantalla hace. Esta aplicación la obtuve a partir de uno de los additions de Chrome. Y ustedes la pueden instalar si es que quieren ahondar un poco más en ella. Vysor (Beta), ahà la tienen. Perfecto. Mi proyecto you está creado. Entonces aquà lo tengo. Muy bien. Entonces como dijimos lo único que haremos es que vamos a generar un botón. Y les platicaba que, en este caso, el bluetooth es uno de los elementos que no está disponible para nuestro emulador. Entonces por esa razón no vamos a poder probar este proyecto en nuestro emulador. Por lo tanto, por eso tengo aquà disponible para que grabemos la pantalla de nuestra computadora. Entonces a este botón le estoy colocando un id que va a decir btnHabilitarBluetooth. Perfecto. Y vamos a colocarle el texto que vamos a definirlo rápidamente en nuestro archivo Strings. Y vamos a decir que éste va a ser el texto del botón activar bluetooth. A veces me cuesta mucho trabajo escribir esa palabra bluetooth, pero bueno, ténganme un poco de paciencia. Entonces este botón va a decir Habilitar Bluetooth. Ahà está. Perfecto. Entonces en nuestro layout, donde estábamos definiendo nuestro botón, vamos a ponerle ese texto. Vamos a ponerle el texto android:text @string y aquà está Activar Bluetooth. Perfecto, you dice el texto deseado. Iré ahora a mi main activity. Y fÃjense bien, haremos algunos métodos adicionales. Primeramente vamos a hacer el método que corresponde a nuestro botón. Voy a ponerle public void habilitarBluetooth. Y como siempre esto va a estar recibiendo un View. Aquà lo ponemos. Y listo, lo vamos a dejar ahà vacÃo. Aprovechando de una vez, vamos a colocar android onClick y vamos a ponerle habilitarBluetooth. Entonces, fÃjense bien. Como esto es un administrador de permisos. No va a ser automático cuando nosotros estemos solicitando el permiso. Como en versiones anteriores a Android únicamente definÃamos nuestro permiso en el archivo Android Manifest que lo tenemos por aquÃ. Y hasta el momento todavÃa vamos a seguir definiendo nuestros permisos ahà en el archivo Android Manifest. Y entonces voy a estar aquà definiendo el permiso para bluetooth. Entonces le vamos a poner aquà uses-permission android:name yvamos a buscar aquà el de bluetooth. Están ordenados alfabéticamente quizá. Este es el que necesitamos. Lo vamos a traer, y listo. you está listo en nuestro proyecto. Perfecto. Una vez dado de alta, tú puedes cerrarlo asà o puedes cerrarlo únicamente con diagonal, asà como lo estoy haciendo. Entonces ahora antes con esta lÃnea de código bastaba para que pudiéramos manejar los permisos en bluetooth. Ahora no, ahora los permisos deben ser de una forma dinámica. Se tienen que estar aprobando de una forma dinámica. Entonces haremos un par de métodos más. El primer método que estaremos trabajando, será el método de checar estatus del permiso. Lo primero que quiero saber es, en algún momento, si el permiso you se activó o no. Entonces, ¡ojo!, aquà hay que diferenciar dos cosas. Si el permiso está activo o si el bluetooth está activo. Primeramente vamos a trabajar la parte del permiso. Entonces vamos a poner checarStatusPermiso. AsÃ. Vamos a poner sus llaves. Y lo que vamos a estar trabajando aquà es una variable entera que va a ser nuestro resultado porque esto es lo que nos va a devolver, lo que vamos a colocar a continuación. Y entonces vamos a colocar ContextCompat.checkSelfPermission. Lo que va a hacer este método es que va a estar checando si el permiso you fue otorgado o no. Entonces lo primero que nos pide es una variable context que la voy a estar inicializando en mi método on create. Entonces primeramente necesito crear esta variable context. Va a ser una variable que va a ser privada. Context y definiremos aquà context. Listo. Y esta variable context la voy a estar inicializando aquà en mi método on create. Y le voy a estar colocando getApplicationContext. Muy bien. Entonces ahora, vamos a continuar con lo que estábamos trabajando con el estatus del permiso. Vamos a colocar el contexto de la aplicación y en seguida es donde estaremos consultando el archivo manifest. Entonces vamos a poner aquà Manifest. Ahora, ¡ojo!, aquà tenemos dos paquetitos. Uno que proviene de Java y el otro que proviene de Android. Son dos clases distintas, entonces nosotros vamos a trabajar nada más el que proviene de Android. Android.Manifest.permission. Y entonces le voy a preguntar por el permiso de bluetooth. Entonces con esta instrucción context desde aquà hasta acá. Estamos preguntando si el permiso existe o si el permiso está dado de alta en nuestra aplicación. Esto nos va a devolver un resultado o un identificador de resultado. Y entonces lo que voy a hacer yo es comparar este resultado. Me va a decir que si es igual al PackageManager. Permission otorgado. Entonces lo que le estoy diciendo es. Oye, el resultado de esto es igual a una de las variables que yo tengo dadas de alta que se llama PERMISSION_GRANTED. Esa variable contiene el identificador de que un permiso fue otorgado. Entonces le pregunto si lo que me devolvió aquà sà fue otorgado o no. El código del resultado de que sà fue otorgado o no. Lo comparo con la variable general de códigos de permisos, si son otorgados o no. Entonces si fue otorgado, lo que haré será devolver un true. Pero si no fue otorgado entonces devolveré un false. Muy bien. Hasta ahorita mi método todavÃa no solicita los permisos. Únicamente consulta el estado de la aplicación a ver si la aplicación tiene dada de alta o si tiene habilitado ese permiso. En especÃfico el permiso de bluetooth. Ustedes pueden estar aquà checando el permiso en especÃfico. A lo mejor no quieren bluetooth, quieren la cámara o quieren cualquier otro permiso. Muy bien. Ahora, a continuación, voy a hacer el método precisamente para solicitar el permiso. Le voy a colocar public void solicitarPermiso. Entonces aquà vamos a generar un if. Un if que va a ser como que, de nuevo, va a consultar. FÃjate bien cómo va a trabajar. Entonces vamos a poner App ActivityCompat.shouldShowRequestPermissio- nRationale Y lo que recibe éste como primer parámetro es un activity. Que de la misma forma como estuvimos trabajando context vamos también a definir por acá nuestra variable activity. Le vamos a poner private activity, activity sencillo. AsÃ. Y recuerda importar luego con Alt + Enter, le voy a decir import class. Y esta variable activity también va a estar inicializada en mi método on create. Entonces le voy a colocar aquà simplemente this. Listo. Entonces regreso acá donde estaba solicitando el permiso. Y aquà lo que haces únicamente como un segundo chequeo del permiso. Un chequeo rápido y entonces nuevamente en Manifest le preguntamos por el permiso. Permission de bluetooth. Entonces con esta lÃnea estoy haciendo un chequeo rápido de que si el permiso de bluetooth existe, si está habilitado. Entonces si you está habilitado, voy a mandarle un mensaje toast al usuario que diga: "el permiso you fue otorgado". Y entonces, le podemos decir: "si deseas desactivarlo puedes ir a los ajustes de la aplicación". Muy bien. Y si el permiso no ha sido otorgado, entonces voy a colocar aquà un else. Y voy a hacer con mi misma clase ActivityCompat voy a decirle request permissions. O sea, solicita el permiso. Le paso primero la actividad, le voy a decir new. Si observas eso nos solicita un String de permisos, un arreglo de permisos. Entonces yo puedo aquà estar trabajando un String de permisos. Le voy a poner aquà permissions. Y entonces aquà es donde yo puedo estar trabajando varias veces. Aquà vamos a cambiar esto. Puedo estar manejando un arreglo de permisos, o sea, aquà voy a poner primero mi permiso .permission. BLUETOOTH. Y al mismo tiempo puedo estar poniendo coma y entonces agregar otro permiso. Nuestro último parámetro que debemos colocar por acá es. Esto nos va a devolver un código de solicitud de permiso. Entonces es hacer una variable que vamos a estar por aquÃ. Y dando de alta código, vamos a poner solicitud permiso. Y bueno, como observas me lo marcó en rojo porque no la hemos creado. Muy bien. Le vamos a dar Alt + Enter y le vamos a decir que sea. Crear una constante, un campo constante, código solicitud de permiso. Perfecto. ¿Qué nos ha creado por acá? Aquà está nuestra variable, nos la ha creado en la cabecera de las variables. Y le vamos a decir que sea igual a uno. Es un código de solicitud de permiso que tú puedes manejar a tu antojo. Nos falta por aquà definir el tipo de dato. Vamos a decir que sea un entero y listo. Entonces este código de solicitud de permiso es lo que vamos a estar manejando aquà cuando estemos solicitando los permisos. Entonces, como observas, vamos a estar solicitando varios permisos de una sola vez. Todos separados en un arreglo de String. Entonces enviamos un código de solicitud de permiso simplemente para tener el control de nuestros permisos. Muy bien, con esto quedarÃa listo nuestro método solicitar permisos. Hay un método más que debemos estar cachando y es un método call back. Entonces cuando nosotros solicitamos el permiso en esta lÃnea, automáticamente se ejecuta un método call back. El método se llama onRequest. Está ahà dado de alta, es parte de nuestros métodos de la clase padre que hemos heredado AppCompatActivity. Entonces simplemente escribiendo onRequestPermissionsResult es el resultado del permiso. Entonces este método se ejecuta una vez que you se dio de alta el permiso. Entonces nosotros lo que vamos a estar trabajando en este permiso. En este método es precisamente la gestión del permiso que acabamos de otorgar. Como te comentaba pues puede estar otorgando varios permisos al mismo tiempo. Y entonces es necesario estar detectando qué permiso fue el que otorgamos. Y entonces, de esta forma, está lanzando un mensaje al usuario de que el permiso you se activó o el permiso no se ha activado. Entonces para eso voy a generar un Switch. Que vamos a cachar este parámetro dice requestCode. Donde este parámetro me va a estar devolviendo el código del permiso solicitado. Entonces aquà le voy a decir si ese código que devolviste es el mismo al que yo mandé, a éste que está aquÃ. Si es el mismo al que yo mandé, entonces vas a mostrar un mensaje, Toast.makeText. Entonces vas a mostrar un mensaje, lo voy hacer aquà con esta opción Create a new toast, que nos lo hace automáticamente. Le voy a decir, you está activo el permiso para bluetooth. Ustedes pueden estar enviando aquà varios permisos o si quieren en diferentes lÃneas de código. Y estar mandando diferentes tipos de códigos de solicitud de permiso, y entonces por acá estár gestionando uno a uno cada permiso. Entonces con eso enviamos nuestro mensaje y decimos break. Podemos poner otro case por acá si estás enviando otra solicitud de permiso. Y entonces mostrarle un mensaje al usuario de que éste permiso you fue otorgado. Muy bien. Hasta el momento you tenemos toda la parte de solicitar un permiso, onRequestPermissionsResult, estamos cachando el call back. Otra cosa que podemos hacer aquà también para verificar si el permiso you fue otorgado, es antes de enviar este mensaje, pues verificar que realmente el permiso se haya otorgado. Entonces voy a poner un if, y voy a llamar este método checarStatus del permiso, lo voy a poner por aquÃ. Acá lo ponemos. Y entonces recuerda que ese método me va a devolver un valor verdadero en caso de que you se haya activado el permiso. O un valor falso en caso de que no se haya activado el permiso. Entonces si el permiso you está activo, entonces le decimos, you está activo el permiso. Colocamos este mensaje. Pero si no, serÃa bueno también avisar al usuario que el permiso no está activo. Podemos poner, you está activo el permiso para bluetooth. Podemos decir, no está activo el permiso para bluetooth. Y entonces aquà estamos utilizando nuestro método checarStatus del permiso. Muy bien. Estamos you gestionando perfecto nuestros permisos. Ahora lo que haremos será pues una vez que you tenemos otorgado el permiso, pues habilitaremos el bluetooth. Entonces me posiciono en mi método que reacciona cuando presiono o cuando doy clic a ese botón de habilitar bluetooth. Lo primero que voy a hacer es llamar a mi método solicitar permiso. Una vez solicitado el permiso, entonces you puedo empezar a habilitar el bluetooth. Entonces voy a colocar aquà un BluetoothAdapter, es lo primero que necesito BluetoothAdapter y lo voy a inicializar con getDefaultAdapter. Este adaptador nos va a ayudar precisamente a gestionar si el dispositivo tiene presente o no un bluetooth. Entonces si no existe un bluetooth, es decir que nuestro objeto mBluetoothAdapter es igual igual a null, puede ser que de pronto nuestro dispositivo no tenga bluetooth. Entonces podemos enviar un mensaje de que, tu dispositivo no tiene bluetooth. Pero si sà tiene, entonces podemos continuar verificando si el bluetooth está activado o no. Si el bluetooth está activado, entonces nosotros you no tendrÃamos que hacer nada aquÃ. Pero si el bluetooth no está activado entonces nosotros tendrÃamos que activarlo. Entonces para ello voy a poner mi mBluetoothAdapter y le voy a preguntar isEnabled. Si el bluetooth está activado, recuerda, no tenemos que hacer nada. Pero si no está activado, entonces aquà estoy utilizando la lógica negada. Y entonces aquà voy a colocar precisamente las instrucciones que habiliten mi bluetooth. Para ello tengo que colocar un Intent, ahà le voy a decir este Intent se va a llamar habilitarBluetoothIntent. Con un Intent es la forma en que yo puedo estar habilitando mi bluetooth. Utilizaré mi clase BluetoothAdapter y le voy a decir ACTION_REQUEST_ENABLE, y listo. Punto y coma. Con esta instrucción you he configurado mi Intent. Lo siguiente es disparar el Intent y voy a utilizar la instrucción startActivityForResult. Enviaré mi Intent y aquà también estaré mandando un código de solicitud para habilitar el bluetooth. Entonces voy a definir aquà mi variable, CODIGO_SOLICITUD que será HABILITAR_BLUETOOTH. Recuerda que nos lo va a marcar en rojo, es una constante que estamos creando nosotros. Entonces la vamos a declarar, voy a dar alt enter y me aparece este menú donde me dice create constant field, le voy a decir que sÃ. Y aquà este Int me lo pone aquÃ, entonces lo vamos a poner acá. Y le vamos a decir que el código para el bluetooth es cero. Este código y el otro son independientes, no tienen nada que ver, simplemente estamos manejando códigos de solicitud. En este caso para activar un permiso y en el otro caso para habilitar el bluetooth o para activarlo. Perfecto. you está listo nuestro proyecto. Entonces como te comentaba por el momento no podemos probarlo en nuestro emulador pero sà podemos probarlo en nuestro teléfono. Entonces voy a correrlo en mi teléfono que yo you tengo por aquà listo. Tengo esta ventana que ahorita estás viendo. Entonces aquà mira que tengo activado el bluetooth. Entonces simplemente, antes de cualquier cosa lo vamos a desactivar. Entonces you está desactivado. Puede ser que veas ahorita mi pantalla con un delay. Y lo que estamos esperando es únicamente a que Gradel termine de compilar el proyecto. Parece que you terminó, you está a punto de lanzar la aplicación. Vamos a revisar aquà los mensajes. Run, listo, you está lanzando la aplicación perfecto. Aquà está nuestra aplicación. Habilitar Bluetooth. Como observas el bluetooth está desactivado, aquà no lo puedes ver pero en realidad está desactivado. Entonces lo que haremos será darle clic en habilitar Bluetooth. Dice nos está gestionando el permiso. Primeramente nos muestra un mensaje que dice, una aplicación quiere activar Bluetooth en este dispositivo. PodrÃas rechazarlo o podrÃas permitirlo. Vamos a permitirlo para este objetivo. Dice activando y en este momento se ha activado. Y mostramos también un mensaje que dice, you está activado el Bluetooth. Muy bien. Y como observas en la barra de notificaciones efectivamente tenemos activado el Bluetooth. Entonces a la perfección hemos gestionado este permiso. Si yo le doy de nuevo habilitar Bluetooth me dice, este permiso you está activo para Bluetooth. Y quiere decir que you está activo el permiso para Bluetooth. Y bueno, también por lo tanto, podrÃa yo gestionar en caso de que el Bluetooth esté activado, también mostrar una notificación al respecto. ¿Entonces cómo puedo estar gestionando más este permiso? Puedo estar yendo a la configuración, entonces yendo a las aplicaciones y en las aplicaciones ahà tengo que localizar mi aplicación de ActivarBluetooth, ahà está arriba. Y entonces aquà pues veo toda la parte de la aplicación, lo que está sucediendo con la aplicación. Aquà precisamente estoy buscando dónde gestionar el permiso, es en esta tuerquita. Vamos a decir permisos de aplicaciones. Y bueno aquà nos aparece todo el gestionamiento de quién tiene permiso a qué. Entonces está por ejemplo el almacenamiento, yo puedo estar viendo qué aplicaciones están activas o están dadas de alta para el almacenamiento. Miramos a ver por acá, permisos adicionales. Hay algunas para leer mensajes instantáneos, este es el de micrófono, el de cámara. Y de esta forma es como podemos estar gestionando los permisos de nuestras aplicaciones. En este momento nosotros solamente estuvimos trabajando con el permiso de Bluetooth. Tú podrÃas estar trabajando con el permiso de activar la cámara, u obtener la localización de alguien, activar el WiFi, etc. Cualquier cosa que se considere privada del usuario, debemos siempre estar solicitando permisos.