You are on page 1of 37

Recursos

Temario

• Logro
• Permisos
• Cámara
• Audio
Logro

Al finalizar la sesión, el estudiante


construye experiencias móviles
nativas que utilizan recursos
internos para captura de imágenes,
video y audio del dispositivo.
TEMA # 1

Permisos
Permisos

Toda app en Android se ejecuta en un sandbox con


acceso limitado.
Permisos

¿Cuándo se requiere permisos?

Necesidad de recursos o información fuera del sanbox.


Declaración de permisos

¿Dónde solicito permisos?

Listar permisos en App Manifiest


Asignación de Permisos

Según sensibilidad del permiso

Automática
Solicitar al usuario
Asignación de Permisos

Según versión de plataforma

Instalación (< 6.0)


Runtime (6.0+)
Normal & Dangerous
normal permissions

App necesita acceso a datos ó recursos fuera del


sandbox, con mínimo riesgo para la privacidad del
usuario o la operación de otras apps.

El sistema concede el permiso automáticamente.

Ejemplo:
ACCESS_NETWORK_STATE
INTERNET
http://developer.android.com/guide/topics/security/normal-permissions.html
Normal & Dangerous
dangerous permissions

App necesita acceso a datos ó recursos que involucran


información privada del usuario, o que podrían afectar
datos almacenados del usuario u operación de otras
apps.

El usuario tiene que conceder el permiso de manera


explícita.

Ejemplo:
READ_CONTACTS
https://developer.android.com/guide/topics/security/permissions.html
Normal & Dangerous
Dangerous Permission Group Dangerous Permissions
READ_CALENDAR

CALENDAR
WRITE_CALENDAR
CAMERA CAMERA
READ_CONTACTS

CONTACTS WRITE_CONTACTS

GET_ACCOUNT
ACCESS_FINE_LOCATION

LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO

READ_PHONE_STATE

CALL_PHONE
READ_CALL_LOG

PHONE WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS BODY_SENSORS

SEND_SMS
RECEIVE_SMS
SMS READ_SMS
RECEIVE_MAP
RECEIVE_MMS

READ_EXTERNAL_STORAGE

STORAGE
WRITE_EXTERNAL_STORAGE
Solicitar Permisos
¿Cuándo son necesarios?

Necesarios para realizar acciones directamente.

Si se usa un Intent para solicitar información, el app no


requiere permisos.
Permission Request (Solicitar Permisos)
<uses-permission>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package=“pe.edu.upc.permapp”>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application ...>
...
</application>
</manifest>
Runtime Request
Verificar Permisos

Verificar cada vez que se realizará la operación que


requiere el permiso.
Usar
ContextCompat.checkSelfPermission()
Retorna
PackageManager.PERMISSION_GRANTED ó
PackageManager.PERMISSION_DENIED

// Assume thisActivity is the current activity


int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
Runtime Request
Solicitar Permisos
Usar
requestPermissions()
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// 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(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Runtime Request
Tratamiento del Response
Implementar
onRequestPermissionsResult()
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[],
int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// 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.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other permissions this app might request
}
}
Runtime Request
Consideraciones

El sistema hace la solicitud por Permission Group, sin


embargo, se debe solicitar cada permiso requerido.
Best Practices

Contemple el usar un Intent (Consider Using an Intent).


Solicite sólo los permisos necesarios (Only Ask for
Permissions You Need).
No abrume al usuario (Don’t Overwhelm the User).
Explique por qué requiere los permisos (Explain Why You
Need Permissions).
Best Practices
Verificar la versión del sistema en Runtime
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Your runtime actions
}

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
TEMA # 2

Cámara
Cámara
Requerir que el dispositivo tenga cámara
Afecta visibilidad de App en Google Play

<manifest ... >


<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>

“true” si es core feature


Cámara

Verificar disponibilidad

hasSystemFeature(PackageManager.FEATURE_CAMERA)
Cámara

Tomar una foto

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {


Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
Cámara

Grabar video

static final int REQUEST_VIDEO_CAPTURE = 1;

private void dispatchTakeVideoIntent() {


Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
}
}
Cámara

Tratar resultados (foto)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
// Get a Picture thumbnail
Bitmap imageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(imageBitmap);
}
}
Cámara

Tratar resultados (video)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
Uri videoUri = intent.getData();
mVideoView.setVideoURI(videoUri);
}
}
Cámara

Grabar media file

<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
Cámara

Grabar media file

// Public Photos Directory


getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)

// App’s Storage
getExternalFilesDir(Environment.DIRECTORY_PICTURES)

// Other Media Directories


DIRECTORY_MOVIES
DIRECTORY_MUSIC
TEMA # 2

Cámara
Audio
Grabar audio
Crear instancia de android.media.MediaRecorder.
Establecer audio source con MediaRecorder.setAudioSource().
Establecer formato de salida con MediaRecorder.setOutputFormat().
Establecer nombre de archivo de salida con
MediaRecorder.setOutputFile().
Establecer audio encoder con MediaRecorder.setAudioEncoder().
Invocar a método prepare() en objeto MediaRecorder.
Iniciar captura de audio con start().
Detener captura de audio con stop().
Liberar recurso con release().
Audio
Grabar audio
String mFileName;
MediaRecorder mRecorder;
// …
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
}

private void stopRecording() {


mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
Audio
Reproducir audio
Crear instancia de android.media.MediaPlayer.
Establecer audio source con.setDataSource().
Establecer nombre de archivo a reproducir con.setDataSource().
Invocar a método prepare() en objeto MediaPlayer.
Iniciar captura de audio con .start().
Detener captura de audio con .stop().
Liberar recurso con .release().
Audio
Reproducir audio
String mFileName;
MediaPlayer mPlayer;
// …
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}

private void stopPlaying() {


mPlayer.release();
mPlayer = null;
}
Conclusiones

1 Cámara y Media

2 Permisos 5 Cámara 7 Audio

3 Normal 6 Requerir en dispositivo 8 Grabar Audio


Dangerous Verificar disponibilidad Reproducir Audio
Tomar foto

4 Install Request
Runtime Request
Bibliografía

• Media & Camera


https://developer.android.com/guide/topics/media/index.html

• Building apps with multimedia


https://developer.android.com/training/building-multimedia.html
Material producido por la Universidad Peruana de Ciencias Aplicadas
Autor: Ángel Augusto Velásquez Núñez
COPYRIGHT ©UPC 2016 - Todos los derechos reservados.