Created
March 3, 2017 12:43
-
-
Save Domacoski/07114042853c88a2f9dab097738a40c3 to your computer and use it in GitHub Desktop.
Copia uma imagem selecionada e guarda em uma pasta local
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.content.Intent; | |
import android.content.pm.PackageManager; | |
import android.database.Cursor; | |
import android.net.Uri; | |
import android.os.Bundle; | |
import android.provider.MediaStore; | |
import android.support.v4.app.ActivityCompat; | |
import android.support.v4.content.ContextCompat; | |
import android.support.v7.app.AppCompatActivity; | |
import android.view.View; | |
import android.widget.Button; | |
import android.widget.Toast; | |
import java.io.File; | |
import java.io.FileInputStream; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.nio.channels.FileChannel; | |
public class MainActivity extends AppCompatActivity { | |
/** | |
* Diretótio onde vamos salvar | |
*/ | |
private static final String DIRETORIO = "/app/imagens/"; | |
/** | |
* Código de retono da galeria | |
*/ | |
private static final int IMAGEM_INTERNA = 123; | |
/** | |
* Código de retrono da permissão | |
*/ | |
private static final int CODE_PERMISSION = 12; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
Button.class.cast(findViewById(R.id.openGallery)).setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View v) { | |
Intent intent = new Intent(Intent.ACTION_PICK); | |
intent.setType("image/*"); | |
startActivityForResult(intent, IMAGEM_INTERNA); | |
} | |
}); | |
} | |
@Override | |
protected void onStart() { | |
super.onStart(); | |
//cehaca a permissão! | |
checkPermission(); | |
} | |
/** | |
* Método responsável por verificar se o app possui a permissão de escrita e leitura | |
*/ | |
private void checkPermission() { | |
// Verifica necessidade de verificacao de permissao | |
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { | |
// Verifica necessidade de explicar necessidade da permissao | |
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) { | |
Toast.makeText(this,"É necessário a de leitura e escrita!", Toast.LENGTH_SHORT).show(); | |
ActivityCompat.requestPermissions(this, | |
new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE }, | |
CODE_PERMISSION); | |
} else { | |
// Solicita permissao | |
ActivityCompat.requestPermissions(this, | |
new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE}, | |
CODE_PERMISSION); | |
} | |
} | |
} | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, Intent intent){ | |
// Se o resultado for OK e se trarar da rquisição IMAGEM INTERNA, então vamos tratar! | |
if(resultCode == RESULT_OK && requestCode == IMAGEM_INTERNA){ | |
//Pegamos a URI da imagem... | |
Uri uriSelecionada = intent.getData(); | |
// criamos um File com o diretório selecionado! | |
final File selecionada = new File(getRealPathFromURI(uriSelecionada)); | |
/** | |
* Caso não exista o doretório, vamos criar! | |
*/ | |
final File rootPath = new File(android.os.Environment.getExternalStorageDirectory()+DIRETORIO); | |
if(!rootPath.exists()){ | |
rootPath.mkdirs(); | |
} | |
/** | |
* Criamos um file, com o no DIRETORIO, com o mesmo nome da anterior | |
*/ | |
final File novaImagem = new File(rootPath, selecionada.getName()); | |
//Movemos o arquivo! | |
try { | |
moveFile(selecionada, novaImagem); | |
Toast.makeText(getApplicationContext(), "Imagem movida com sucesso!", Toast.LENGTH_SHORT).show(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); | |
} | |
} | |
} | |
/** | |
* Copia a imagem e remove o destino | |
*/ | |
private void moveFile(File sourceFile, File destFile) throws IOException { | |
if (!sourceFile.exists()) { | |
return; | |
} | |
FileChannel source = null; | |
FileChannel destination = null; | |
source = new FileInputStream(sourceFile).getChannel(); | |
destination = new FileOutputStream(destFile).getChannel(); | |
if (destination != null && source != null) { | |
destination.transferFrom(source, 0, source.size()); | |
} | |
if (source != null) { | |
source.close(); | |
} | |
if (destination != null) { | |
destination.close(); | |
} | |
//Alertamos, caso não consiga remover | |
if(!sourceFile.delete()){ | |
Toast.makeText(getApplicationContext(), "Não foi possível remover a imagem!", Toast.LENGTH_SHORT).show(); | |
} | |
} | |
/** | |
* Transforma o Uri em um diretório válido, para carregarmos em um arquivo | |
* @param contentUri | |
* @return | |
*/ | |
private String getRealPathFromURI(Uri contentUri) { | |
String[] proj = { MediaStore.Video.Media.DATA }; | |
Cursor cursor = managedQuery(contentUri, proj, null, null, null); | |
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); | |
cursor.moveToFirst(); | |
return cursor.getString(column_index); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment