Como compartilhar texto e imagem no Android

Nível: básico.
Nesse tutorial vou demostrar como é simples e fácil compartilhar texto e imagem no Android.

Criei um projeto no Android Studio com a opção “Blank Activity”, como demonstra a figura 1.
Captura de Tela 2015-03-13 às 16.52.09

No nosso layout vai ter apenas uma imagem(ImageView) e dois botões(buttons), como vocês podem ver na figura 2.

Captura de Tela 2015-03-19 às 10.28.49

No método “onCreate” da Activity, vamos capturar os elementos do layout e adicionar os eventos para click nos botões.

ImageView imageView = ( ImageView ) findViewById( R.id.imageview );
imageView.setImageResource( R.drawable.android );

Button btShareText = ( Button ) findViewById( R.id.bt_share_text );
Button btShareImage = ( Button ) findViewById( R.id.bt_share_image );

 btShareText.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick( View v ) {
                shareText();
            }
        } );

        btShareImage.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick( View v ) {
                shareImage();
            }
} );

Dentro do método “shareText” adicione o código a seguir e após adicioná-lo, faça alguns teste de compartilhamento.

private void shareText() {
        // cria a intent e define a ação
        Intent intent = new Intent( Intent.ACTION_SEND );
        // tipo de conteúdo da intent
        intent.setType( "text/plain" );
        // string a ser enviada para outra intent
        intent.putExtra( Intent.EXTRA_TEXT, "tutorial blog como compartilhar text no android." );
        // inicia a intent
        startActivity( intent );
}

Agora, dentro do método “shareImage”, adicione o seguinte código:

private void shareImage() {

        StringBuilder strBuilder = new StringBuilder();
        strBuilder.append( "android.resource://" )
                // defina o seu package aqui
                .append( "com.luizgadao.sharetextandimage/" )
                //drawable a ser capturado, repare que esse é o drawable definido no src do ImageView
                .append( "drawable/android" );

        //captura a uri do drawable que está no Imageview
        Uri uriImage = Uri.parse( strBuilder.toString() );
        // cria a intent e define a ação
        Intent intent = new Intent( Intent.ACTION_SEND );
        // tipo de conteúdo da intent
        intent.setType( "image/*" );
        // stream a ser compartilhado
        intent.putExtra( Intent.EXTRA_STREAM, uriImage );

        startActivity( intent );
    }

Nos testes que fiz não foi possível compartilhar texto nem imagem no Facebook. No próximo tutorial vou demonstrar como capturar o click ao selecionar um determinado aplicativo, com isso você pode utilizar o SDK do Facebook para compartilhar, conforme sua necessidade.

Segue o vídeo da aplicação rodando no Android.

Titanium, criando uma intent no OS Android

Pessoal, nesse tutorial vou mostrar como é simples criar uma “intent” do Android pelo Titanium e iniciar a “activity” através da “intent“.

Vamos supor que eu preciso acessar o recurso de geolocalização do device do usuário. Para acessar esse recurso pelo Titanium é bem simples, basta verificar se o serviço de geolocalização esta ativa no device acessando a propriedade: Ti.Geolocation.locationServicesEnabled. Para saber mais acesse aqui.
Ao verificar a propriedade, se ela estiver desativada retornando “false“, você não vai conseguir capturar a latitude e a longitude referente a posição do device. Como o serviço esta desativado, você pode informar o usuário através de um “alert“, para que ele ative o serviço de geolocalização e volte ao app. Mas lidar com o usuário é complicado, pois alguns não vão nem saber como habilitar esse serviço e você como desenvolvedor tem que tentar facilitar esse trabalho ao máximo no aplicativo que você estiver desenvolvendo.

Hora de botar a mão na massa! Criei um projeto clássico no Titanium apenas com foco no Android. No arquivo “app.js”, vamos criar uma window e um button, no button vou adicionar um evento de “click” para verificar se a geolocalização esta ativa. Se estiver ativa vou mostar a latitude e a longitude onde o device se encontra, senão, por agora vou exibir um alerta informando o usuário que a geolocalização está desativada.

//criando uma função anônima
( function(){
    var win = Ti.UI.createWindow({
		backgroundColor:'#fff'
	});

	var buttonShowLocation = Ti.UI.createButton({
		title:'show location',
		width:140,
		height:80
	});
	win.add( buttonShowLocation );

        buttonShowLocation.addEventListener( 'click', clickButtonShowLocation );
	function clickButtonShowLocation (e)
	{
		// verificando se geolocalização está ativa
		if( Ti.Geolocation.locationServicesEnabled )
		{
                        //define a precisão requerida da geolocalização
			Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_BEST;

			// caso a geolocalização esteja ativa tente capturar a posição do device
			// o método getCurrentPosition, recebe como parâmetro uma função de callback
			// Caso "e.success" seja verdadeiro é mostrado um alerta com a latitude e longitude
			// que o device se encontra. Senão, é exibido um alerta para o usuário sobre o erro ocorrido
			Ti.Geolocation.getCurrentPosition( function( e ){
				if ( e.success )
				{
					alert( 'latitude: ' + e.coords.latitude + ' longitude: ' + e.coords.longitude );
				}
				else
				{
					alert( 'Error get current position:' + e.error );
				}
			});
		}
		else
		{
			alert( 'GPS disabled.' );
		}

	}

} )();

Vou executar esse exemplo direto no meu nexus e printar aqui os resultados com a geolocalização ativada e desativada.

GPS desativado

GPS desativado

GPS ativado

GPS ativado

Agora, ao invés de mostar um “alert” ao usuário que o serviço de geolocalização está desativado, vamos abrir a tela específica do Android para que ele consiga habilitar o serviço de GPS.

Basta comentar a linha 40 e adicionar o seguinte trecho de código.

var intent = Ti.Android.createIntent({
	action:"android.settings.LOCATION_SOURCE_SETTINGS"
});
Ti.Android.currentActivity.startActivity( intent );

Ao testar o exemplo e ele estiver com o gps desativado, e você clicar no botão, a tela que deve aparecer deve ser semelhante ao print abaixo.
IMG_20140413_224834

Segue o código completo.


( function(){

	var win = Ti.UI.createWindow({
		backgroundColor:'#fff'
	});

	var buttonShowLocation = Ti.UI.createButton({
		title:'show location',
		width:140,
		height:80
	});
	win.add( buttonShowLocation );

	buttonShowLocation.addEventListener( 'click', clickButtonShowLocation );

	function clickButtonShowLocation (e)
	{
		// verificando se geolocalização está ativa
		if( Ti.Geolocation.locationServicesEnabled )
		{
                        //define a precisão requerida da geolocalização
			Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_BEST;
			// caso a geolocalização esteja ativa tenta capturar a posição do device
			// o método getCurrentPosition, recebe como parâmetro uma função de callback
			// Caso "e.success" seja verdadeiro é mostrado um alerta com a latitude e longitude
			// que o device se encontra. Senão, é exibido um alerta o usuário sobre o erro ocorrido
			Ti.Geolocation.getCurrentPosition( function( e ){
				if ( e.success )
				{
					alert( 'latitude: ' + e.coords.latitude + ' longitude: ' + e.coords.longitude );
				}
				else
				{
					alert( 'Error get current position:' + e.error );
				}
			});
		}
		else
		{
			//alert( 'GPS disabled.' );

			var intent = Ti.Android.createIntent({
				action:"android.settings.LOCATION_SOURCE_SETTINGS"
			});
			Ti.Android.currentActivity.startActivity( intent );

		}

	}

	//open window
	win.open();

} )();

Você pode abrir qualquer janela do OS Android, basta definir a “action” certa. Para abrir as definições de rede wifi, altere a “action” do nosso exemplo para a linha abaixo.

action:"android.settings.WIFI_SETTINGS"

Veja o vídeo de exemplo que demonstra o código desse exemplo em execução.

Qualquer dúvida ou sugestão, poste um comentário.