Android – android.os.FileUriExposedException: file:///storage/emulated/0/{MY_FILE} exposed beyond app through Intent.getData()

files java file intent data

Problema:

FATAL EXCEPTION: Thread-2
Process: br.com.helpdev.teste, PID: 26078
android.os.FileUriExposedException: file:///storage/emulated/0/{MY_FILE} exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1813)
at android.net.Uri.checkFileUriExposed(Uri.java:2360)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8981)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8942)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1583)
at android.app.Activity.startActivityForResult(Activity.java:4228)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
at android.app.Activity.startActivityForResult(Activity.java:4187)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:732)
at android.app.Activity.startActivity(Activity.java:4515)
at android.app.Activity.startActivity(Activity.java:4483)
at br.com.helpdev.teste.sistema.pacote.PacotesUtils.instalarPacote(PacotesUtils.java:29)
at br.com.helpdev.teste.sistema.pacote.GerenciadorPacotes.install(GerenciadorPacotes.java:154)
at br.com.helpdev.teste.sistema.pacote.GerenciadorPacotes$2.run(GerenciadorPacotes.java:172)

Solução:
O correto seria utilizar o FileProvider mas uma solução “workaround” bem simples seria: Continue reading

Android – Como pegar uma View da Activity dentro de um Fragment (getActivity().findViewById returns null, called from fragment onActivityCreated)

Android

O segredo para não retornar null é utilizar o getActivity().findViewById dentro do método onActivityCreated

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        activity.findViewById<Button>(R.id.bt_iniciar).setOnClickListener({
            startActivity(Intent(activity, MyActivity::class.java))
        })
    }

Android / Gradle – Definindo um versionName diferente para build e release

gradle

Não é possível definir um versionName diferente para ‘debug’ e ‘release’ porem é possível adicionar um suffix no final do versionName:

android {
    signingConfigs {
        releaseKey {
            keyAlias 'key_flavors'
            keyPassword 'xxxxx'
            storeFile file('../key_release_flavors.jks')
            storePassword 'xxxx'
        }
    }
    compileSdkVersion 27
    defaultConfig {
        applicationId "br.com.helpdev.flavors"
        minSdkVersion 14
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            versionNameSuffix ".15.1"
        }
        release {
            versionNameSuffix ".14"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releaseKey
        }
    }
}

Dessa maneira ao compilar o projeto o debug ficaria com o versionName: 1.0.15.1 e o release com: 1.0.14.

Android – Mobile Vision, API de detecção de faces e objetos (Find objects in photos and video, using real-time on-device vision technology. Face Detection)

face_detect

Introdução à Visão Móvel

A API Mobile Vision fornece uma estrutura para encontrar objetos em fotos e vídeos. A estrutura inclui detectores, que localizam e descrevem objetos visuais em imagens ou quadros de vídeo e uma API orientada a eventos que rastreia a posição desses objetos no vídeo.

API

Atualmente, a API Mobile Vision inclui detectores de rosto, código de barras e texto, que podem ser aplicados separadamente ou em conjunto.

O pacote de visão inclui uma estrutura de funcionalidade de base comum e subpacotes para implementações específicas de detectores:

Funcionalidade comum: com.google.android.gms.vision
Detector de rosto: com.google.android.gms.vision.face
Detector de código de barras: com.google.android.gms.vision.barcode
Detetor de texto: com.google.android.gms.vision.text

COMEÇANDO… Continue reading

Android – Convertento byte[] do onPreviewFrame em um JPEG ( Android byte[] to image in Camera.onPreviewFrame )

android-camera-surfaceview

import android.graphics.YuvImage;

[...]

private volatile byte[] imageYuvData;

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    if(processing)return;
    imageYuvData = data;
}

[...]

public void savePreviewFrame(File file) throws Throwable {
	processing=true;
	try{
        Camera.Parameters parameters = camera.getParameters();
        Size size = parameters.getPreviewSize();
        YuvImage image = new YuvImage(data, parameters.getPreviewFormat(),
                size.width, size.height, null);
        FileOutputStream filecon = new FileOutputStream(file);
        image.compressToJpeg(
        		new Rect(0, 0, image.getWidth(), 
        				image.getHeight()), 90,
        				filecon);
	}finally{
		processing=false;
	}
}

[...]

Android – Bloqueando a orientação de tela programaticamente

full_screen_android

Segue alguns métodos uteis para lidar com a orientação de tela programaticamente.

/**
 * Destravando orientação de tela
 *
 */
public static boolean releaseScreenOrientation(Activity activity) {
    return lockScreenOrientation(activity, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

/**
 * Travando orientação de tela na posição atual.
 *
 */
public static boolean lockCurrentScreenOrientation(Activity activity) {
    return lockScreenOrientation(activity, activity.getRequestedOrientation());
}

/**
 * Recebe como parametro: ActivityInfo.SCREEN_ORIENTATION_XXXXXX
 *
 * @param activity Activity
 * @param screenOrientation ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
 */
public static boolean lockScreenOrientation(Activity activity, int screenOrientation) {
    activity.setRequestedOrientation(screenOrientation);
    return true;
}

/**
 * Recebe como parametro: Surface.ROTATION_X
 *
 * @param activity Activity
 * @param screenRotation Surface.ROTATION_0 / 90 / 180 / 270
 */
public static boolean lockScreenRotation(Activity activity, int screenRotation) {
    if (screenRotation > -1) {
        int orientation = activity.getRequestedOrientation();
        switch (screenRotation) {
            case Surface.ROTATION_0:
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;
            case Surface.ROTATION_90:
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;
            case Surface.ROTATION_180:
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                break;
            case Surface.ROTATION_270:
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                break;
        }
        return lockScreenOrientation(activity, orientation);
    } else {
        return false;
    }
}