O armazenamento externo do Android pode ser usado para gravar e salvar dados, ler arquivos de configuração etc. Este artigo é uma continuação do tutorial de Armazenamento Interno do Android na série de tutoriais sobre armazenamento de dados estruturados no Android.
Armazenamento Externo do Android
O armazenamento externo, como o cartão SD, também pode armazenar dados de aplicativos, não há segurança aplicada aos arquivos que você salva no armazenamento externo. Em geral, existem dois tipos de Armazenamento Externo:
- Armazenamento Externo Primário: Armazenamento compartilhado embutido, que é “acessível pelo usuário ao conectar um cabo USB e montá-lo como uma unidade em um computador host”. Exemplo: Quando dizemos Nexus 5 32 GB.
- Armazenamento Externo Secundário: Armazenamento removível. Exemplo: Cartão SD
Todas as aplicações podem ler e escrever arquivos colocados no armazenamento externo e o usuário pode removê-los. Precisamos verificar se o cartão SD está disponível e se podemos gravar nele. Somente depois de verificar que o armazenamento externo está disponível é que podemos gravar nele, caso contrário, o botão de salvar ficaria desativado.
Exemplo de Estrutura de Projeto para Armazenamento Externo no Android
Primeiramente, precisamos garantir que a aplicação tenha permissão para ler e escrever dados no cartão SD do usuário. Então, abra o arquivo
AndroidManifest.xml
e adicione as seguintes permissões:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Além disso, o armazenamento externo pode estar vinculado ao usuário que o montou como um dispositivo de armazenamento USB. Portanto, precisamos verificar se o armazenamento externo está disponível e não é somente leitura.
if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
saveButton.setEnabled(false);
}
private static boolean isExternalStorageReadOnly() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
return true;
}
return false;
}
private static boolean isExternalStorageAvailable() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
return true;
}
return false;
}
getExternalStorageState()
é um método estático de Environment
para determinar se o armazenamento externo está atualmente disponível ou não. Como você pode ver, se a condição for falsa, desativamos o botão de salvar.
Código de Exemplo para Armazenamento Externo no Android
O layout activity_main.xml é definido da seguinte forma:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Reading and Writing to External Storage"
android:textSize="24sp"/>
<EditText android:id="@+id/myInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" android:lines="5"
android:minLines="3" android:gravity="top|left"
android:inputType="textMultiLine">
<requestFocus />
</EditText>
<LinearLayout
android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1.0"
android:layout_marginTop="20dp">
<Button android:id="@+id/saveExternalStorage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SAVE"
android:layout_weight="0.5"/>
<Button android:id="@+id/getExternalStorage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:text="READ" />
</LinearLayout>
<TextView android:id="@+id/response"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:padding="5dp"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
Aqui, além dos botões de salvar e ler do armazenamento externo, exibimos a resposta de salvar/ler para/de um armazenamento externo em um textview, ao contrário do tutorial anterior onde toast do Android era exibido. A classe MainActivity.java é fornecida abaixo:
package com.journaldev.externalstorage;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import android.os.Bundle;
import android.app.Activity;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText inputText;
TextView response;
Button saveButton,readButton;
private String filename = "SampleFile.txt";
private String filepath = "MyFileStorage";
File myExternalFile;
String myData = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inputText = (EditText) findViewById(R.id.myInputText);
response = (TextView) findViewById(R.id.response);
saveButton =
(Button) findViewById(R.id.saveExternalStorage);
saveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FileOutputStream fos = new FileOutputStream(myExternalFile);
fos.write(inputText.getText().toString().getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
inputText.setText("");
response.setText("SampleFile.txt saved to External Storage...");
}
});
readButton = (Button) findViewById(R.id.getExternalStorage);
readButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream fis = new FileInputStream(myExternalFile);
DataInputStream in = new DataInputStream(fis);
BufferedReader br =
new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
myData = myData + strLine;
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
inputText.setText(myData);
response.setText("SampleFile.txt data retrieved from Internal Storage...");
}
});
if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
saveButton.setEnabled(false);
}
else {
myExternalFile = new File(getExternalFilesDir(filepath), filename);
}
}
private static boolean isExternalStorageReadOnly() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
return true;
}
return false;
}
private static boolean isExternalStorageAvailable() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
return true;
}
return false;
}
}
- Environment.getExternalStorageState(): retorna o caminho para o ponto de montagem do SD interno como “/mnt/sdcard”
- getExternalFilesDir(): Retorna o caminho para a pasta de arquivos dentro de Android/data/data/application_package/ no cartão SD. É usado para armazenar quaisquer arquivos necessários para o seu aplicativo (como imagens baixadas da web ou arquivos de cache). Uma vez que o aplicativo seja desinstalado, quaisquer dados armazenados nesta pasta também desaparecem.
Também, se o armazenamento externo não estiver disponível, desabilitamos o botão de salvar usando a condição if que foi discutida anteriormente neste tutorial. Abaixo está nossa aplicação rodando no emulador Android, onde estamos escrevendo dados no arquivo e então lendo. Nota: Certifique-se de que seu Emulador Android esteja configurado de forma que tenha um cartão SD, conforme mostrado na caixa de diálogo de imagem do AVD abaixo. Vá para Ferramentas->Android->Dispositivo Virtual Android, edite configurações->Mostrar Configurações Avançadas.
Isso encerra este tutorial. Vamos discutir o armazenamento usando Preferências Compartilhadas no próximo tutorial. Você pode baixar o Projeto de Exemplo de Armazenamento Externo do Android no link abaixo.
Baixe o Projeto de Exemplo de Armazenamento Externo do Android
Source:
https://www.digitalocean.com/community/tutorials/android-external-storage-read-write-save-file