<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=PDM_Avanzado_Permisos_AndroidManifiest.xml</id>
	<title>PDM Avanzado Permisos AndroidManifiest.xml - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=PDM_Avanzado_Permisos_AndroidManifiest.xml"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_Permisos_AndroidManifiest.xml&amp;action=history"/>
	<updated>2026-10-24T02:03:12Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_Permisos_AndroidManifiest.xml&amp;diff=60707&amp;oldid=prev</id>
		<title>Carrion: /* Creamos a activity */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=PDM_Avanzado_Permisos_AndroidManifiest.xml&amp;diff=60707&amp;oldid=prev"/>
		<updated>2016-10-24T05:58:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Creamos a activity&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Introdución==&lt;br /&gt;
&lt;br /&gt;
Como xa sabedes cando facemos algunha aplicación que necesite permisos especiais, é necesario engadir ditos permisos ao arquivo AndroidManifiest.xml.&lt;br /&gt;
&lt;br /&gt;
A partires da API 23, Android incorpora outro nivel de seguridade, de tal forma que agora, a maiores, teremos que solicitar dito permiso a nivel de programación.&lt;br /&gt;
&lt;br /&gt;
Nese entre ao usuario apareceralle un diálogo no que se lle solicitará o seu permiso para que a aplicación faga uso do recurso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Permisos_1.JPG | 400px | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Isto só se aplica a permisos denominados &amp;#039;&amp;#039;&amp;#039;perigosos&amp;#039;&amp;#039;&amp;#039; (o veremos a continuación) e executando a aplicación nun dispositivo cunha versión Android 6.0 e un targetSDK 23.&lt;br /&gt;
En caso contrario, o permiso o pedirá como ata o de agora, no momento da instalación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Máis información en:&lt;br /&gt;
* http://developer.android.com/training/permissions/requesting.html&lt;br /&gt;
* http://developer.android.com/guide/topics/security/permissions.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tipos de permisos==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nota:&amp;#039;&amp;#039;&amp;#039; Isto só é aplicable a aplicacións cun TargetSDK 23 e executadas nun dispositivo cunha API 23 (Android 6.0).&lt;br /&gt;
&lt;br /&gt;
En Android teremos dous tipos de permisos:&lt;br /&gt;
&lt;br /&gt;
* Normais: permisos que non afectan á privacidade do usuario. Estes só teñen que estar incluídos no arquivo androidmanifiest.xml&lt;br /&gt;
* Perigosos: permisos que poden afectar a privacidade do usuario e teñen que ser permitidos polo usuario no momento que se necesiten por parte da aplicación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Temos unha lista dos permisos denominados perigosos [http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous neste enlace].&lt;br /&gt;
&lt;br /&gt;
==Comprobando se temos o permiso==&lt;br /&gt;
&lt;br /&gt;
O permiso non é necesario pedilo sempre. Con tal de que o dea a primeira vez xa queda &amp;#039;gardado&amp;#039;. Polo tanto podemos chequear se xa temos o permiso do usuario.&lt;br /&gt;
&lt;br /&gt;
Neste exemplo estamos a solicitar un permiso para chamar por teléfono. &lt;br /&gt;
&lt;br /&gt;
Previamente teríamos que ter posto no &amp;#039;&amp;#039;&amp;#039;androidmanifiest.xml&amp;#039;&amp;#039;&amp;#039; o permiso correspondente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;uses-permission android:name=&amp;quot;android.permission.CALL_PHONE&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
O código dentro da activity:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;1,2,3&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
           if (Build.VERSION.SDK_INT==23){&lt;br /&gt;
                    int permiso = checkSelfPermission(Manifest.permission.CALL_PHONE);&lt;br /&gt;
                    if (permiso ==PackageManager.PERMISSION_GRANTED){&lt;br /&gt;
                            // TEMOS O PERMISO&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                            // NON TEMOS O PERMISO TEREMOS QUE SOLICITALO&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Liña 1: Comprobamos que a versión é a API 23. Isto é necesario se temos un minSDK inferior á 23.&lt;br /&gt;
* Liña 2: Chamamos ao método checkSelfPermission, que devolve un número que nos vai a indicar se temos o permiso.&lt;br /&gt;
* Liña 3: Comprobamos se temos o permiso (granted ou denied).&lt;br /&gt;
&lt;br /&gt;
Neste código suponse que a activity deriva da clase Activity e non dunha AppCompatActivity (librerías de compatibilidade). Se é o caso, o código varía un pouco:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;2&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
           if (Build.VERSION.SDK_INT==23){&lt;br /&gt;
                    int permiso = ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE);&lt;br /&gt;
                    if (permiso ==PackageManager.PERMISSION_GRANTED){&lt;br /&gt;
                            // TEMOS O PERMISO&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                            // NON TEMOS O PERMISO TEREMOS QUE SOLICITALO&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solicitando o permiso==&lt;br /&gt;
&lt;br /&gt;
Para solicitar o permiso temos que chamar a un método que dará como resultado a visualización dunha caixa de diálogo;&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Permisos_1.JPG | 200px | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O resultado dese diálogo vai ir a o &amp;#039;&amp;#039;&amp;#039;método onRequestPermissionsResult&amp;#039;&amp;#039;&amp;#039;. Como podemos ter varios permisos diferentes, podemos enviar un código asociado a dita solicitude para que despois poidamos distinguir cal foi o permiso concedido ou denegado por parte do usuario.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;6,11,15-22&amp;quot; &amp;gt;&lt;br /&gt;
 // Usado por si necesitamos diferentes permisos, para identificar cual de ellos es&lt;br /&gt;
   private final int CODIGO_IDENTIFICADOR=1;&lt;br /&gt;
  &lt;br /&gt;
   public void pedirPermiso(){&lt;br /&gt;
 &lt;br /&gt;
      requestPermissions( new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   @Override&lt;br /&gt;
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {&lt;br /&gt;
&lt;br /&gt;
        switch (requestCode) {&lt;br /&gt;
            case CODIGO_IDENTIFICADOR: {&lt;br /&gt;
                // Se o usuario premeou o boton de cancelar o array volve cun null&lt;br /&gt;
                if (grantResults.length &amp;gt; 0&lt;br /&gt;
                        &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {&lt;br /&gt;
                    // PERMISO CONCEDIDO&lt;br /&gt;
                } else {&lt;br /&gt;
                    // PERMISO DENEGADO&lt;br /&gt;
                    Toast.makeText(this,&amp;quot;É NECESARIO O PERMISO PARA CHAMAR POR TELÉFONO&amp;quot;,Toast.LENGTH_LONG).show();&lt;br /&gt;
                }&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // Comprobamos os outros permisos&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Liña 6: Solicitamos o permiso enviado un código asociado (valor 1)&lt;br /&gt;
* Liña 11: Aquí chega a resposta do usuario.&lt;br /&gt;
* Liñas 15-22: Xestionamos que o usuario concedera ou non o permiso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No caso de utilizar unha biblioteca de compatibilidade, o código sería:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;4&amp;quot; &amp;gt;&lt;br /&gt;
  &lt;br /&gt;
   public void pedirPermiso(){&lt;br /&gt;
 &lt;br /&gt;
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Caso práctico==&lt;br /&gt;
&lt;br /&gt;
O obxectivo desta práctica e ver pedir un permiso ao S.O. Android de tipo &amp;#039;perigoso&amp;#039;. Concretamente para chamar a un número de teléfono.&lt;br /&gt;
&lt;br /&gt;
Consta dun botón no que se chamará a un número prefixado.&lt;br /&gt;
&lt;br /&gt;
[[Imagen:PDM_Avanzada_Permisos_2.jpg | 400px | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Creamos a activity===&lt;br /&gt;
&lt;br /&gt;
*Nome do proxecto: &amp;#039;&amp;#039;&amp;#039;UD08_01_Permisos&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*Nome da activity: &amp;#039;&amp;#039;&amp;#039;UD08_01_Permisos.java&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código do layout xml&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;RelativeLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&lt;br /&gt;
    xmlns:tools=&amp;quot;http://schemas.android.com/tools&amp;quot; android:layout_width=&amp;quot;match_parent&amp;quot;&lt;br /&gt;
    android:layout_height=&amp;quot;match_parent&amp;quot; android:paddingLeft=&amp;quot;@dimen/activity_horizontal_margin&amp;quot;&lt;br /&gt;
    android:paddingRight=&amp;quot;@dimen/activity_horizontal_margin&amp;quot;&lt;br /&gt;
    android:paddingTop=&amp;quot;@dimen/activity_vertical_margin&amp;quot;&lt;br /&gt;
    android:paddingBottom=&amp;quot;@dimen/activity_vertical_margin&amp;quot;&lt;br /&gt;
    tools:context=&amp;quot;es.cifprodolfoucha.angelfernandez.myapplication.UD08_01_Permisos&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Button&lt;br /&gt;
        android:layout_width=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:layout_height=&amp;quot;wrap_content&amp;quot;&lt;br /&gt;
        android:text=&amp;quot;Chamar por teléfono&amp;quot;&lt;br /&gt;
        android:id=&amp;quot;@+id/UD08_01_btnChamar&amp;quot;&lt;br /&gt;
        android:layout_alignParentTop=&amp;quot;true&amp;quot;&lt;br /&gt;
        android:layout_centerHorizontal=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RelativeLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase UD08_01_Permisos&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo:&amp;#039;&amp;#039;&amp;#039; Solicitar un permiso para un dispositivo Android 6.0 e un targetSDK=23.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nota:&amp;#039;&amp;#039;&amp;#039; Non se utilizan bibliotecas de compatibilidade.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class UD08_01_Permisos extends Activity {&lt;br /&gt;
&lt;br /&gt;
    // Usado por si necesitamos diferentes permisos, para identificar cual de ellos es&lt;br /&gt;
    private final int CODIGO_IDENTIFICADOR=1;&lt;br /&gt;
&lt;br /&gt;
    private void chamarTelefono(){&lt;br /&gt;
        Intent callIntent = new Intent(Intent.ACTION_CALL);&lt;br /&gt;
        callIntent.setData(Uri.parse(&amp;quot;tel:123456789&amp;quot;));&lt;br /&gt;
        startActivity(callIntent);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void xestionarEventos(){&lt;br /&gt;
&lt;br /&gt;
        Button boton = (Button)findViewById(R.id.UD08_01_btnChamar);&lt;br /&gt;
        boton.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View view) {&lt;br /&gt;
&lt;br /&gt;
                if (Build.VERSION.SDK_INT==23){&lt;br /&gt;
                    int permiso = checkSelfPermission(Manifest.permission.CALL_PHONE);&lt;br /&gt;
                    if (permiso ==PackageManager.PERMISSION_GRANTED){&lt;br /&gt;
                        chamarTelefono();&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        UD08_01_Permisos.this.requestPermissions( new String[]{Manifest.permission.CALL_PHONE},CODIGO_IDENTIFICADOR);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;
        super.onCreate(savedInstanceState);&lt;br /&gt;
        setContentView(R.layout.activity_ud08_01__permisos);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        xestionarEventos();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void onRequestPermissionsResult(int requestCode,&lt;br /&gt;
                                           String permissions[], int[] grantResults) {&lt;br /&gt;
        switch (requestCode) {&lt;br /&gt;
            case CODIGO_IDENTIFICADOR: {&lt;br /&gt;
                // If request is cancelled, the result arrays are empty.&lt;br /&gt;
                if (grantResults.length &amp;gt; 0&lt;br /&gt;
                        &amp;amp;&amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {&lt;br /&gt;
                    chamarTelefono();&lt;br /&gt;
                } else {&lt;br /&gt;
&lt;br /&gt;
                    Toast.makeText(this,&amp;quot;É NECESARIO O PERMISO PARA CHAMAR POR TELÉFONO&amp;quot;,Toast.LENGTH_LONG).show();&lt;br /&gt;
                }&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // other &amp;#039;case&amp;#039; lines to check for other&lt;br /&gt;
            // permissions this app might request&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;
        // Inflate the menu; this adds items to the action bar if it is present.&lt;br /&gt;
        getMenuInflater().inflate(R.menu.menu_telefono_carrion, menu);&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public boolean onOptionsItemSelected(MenuItem item) {&lt;br /&gt;
        // Handle action bar item clicks here. The action bar will&lt;br /&gt;
        // automatically handle clicks on the Home/Up button, so long&lt;br /&gt;
        // as you specify a parent activity in AndroidManifest.xml.&lt;br /&gt;
        int id = item.getItemId();&lt;br /&gt;
&lt;br /&gt;
        //noinspection SimplifiableIfStatement&lt;br /&gt;
        if (id == R.id.action_settings) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return super.onOptionsItemSelected(item);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]]&lt;/div&gt;</summary>
		<author><name>Carrion</name></author>
	</entry>
</feed>