[RESOLVIDO] Como importar/exportar um arquivo da memória interna do celular para a memória externa do sistema do app no Android Studio?

Boa noite.

Consegui fazer a Exportação do banco de dados de um app do Android Studio para a memória Externa do Celular, porém estou querendo fazer o inverso agora, ou seja, pegar esse arquivo que foi salvo na memória externa do celular e salvá-lo na memória do sistema do app, onde está o banco de dados SQLite.

Fiz a importação do arquivo usando a mesma lógica da exportação, só que invertendo os valores com o fim de resgatar esse arquivo que está NA memória externa do celular PARA A memória do sistema, onde está o banco de dados.

Para salvar o meu banco de dados NA memória externa do celular eu fiz:

File pastaOrigem = new File("//data/data/sistema.escola/databases/Escola.db");
File pastaDestino = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA");
File arquivoDestinoExterno = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

try {
    pastaDestino.mkdir();
    FileChannel input = new FileInputStream(pastaOrigem).getChannel(); // FileInputStream é a leitura de fluxo de dados
    FileChannel Output = new FileOutputStream(arquivoDestinoExterno).getChannel(); // FileOutputStream é um fluxo de saída para gravar dados em um File

    Output.transferFrom(input, 0, input.size());
    input.close();
    Output.close();
}
catch (IOException e) {
    e.printStackTrace();
}

Agora desejo fazer o inverso, pegar ele DA memória externa para colocá-lo NO sistema (tipo, se o app foir desinstalado, ao instalá-lo novamente, importaria o arquivo que foi exportado, para recuperar os dados que foram salvos). Nesse caso fiz o código assim:

public String importacaoBanco() {
    String retorno = null;

    File pastaOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA");
    File arquivoDestinoSistema = new File(Environment.getDataDirectory()+"//data/data/sistema.escola/databases/Escola.db");

    try {
        FileChannel input = new FileInputStream(pastaOrigem).getChannel();
        FileChannel Output = new FileOutputStream(arquivoDestinoSistema).getChannel();

        Output.transferFrom(input, 0, input.size());
        input.close();
        Output.close();

        return retorno = "UPLOAD REALIZADO COM SUCESSO!";
    }
    catch (IOException e) {
        e.printStackTrace();
        return retorno = "UPLOAD NÃO REALIZADO!";
    }
}

Mas está rodando o catch(), ou seja, ele não está importando o arquivo DA memória externa do celular PARA O sistema do app, onde está salvo o banco de dados. Na vdd o arquivo do sistema seria substituído por este que foi exportado/salvo na memória externa do celular.

Obg!

qual erro dá?

Não dá erro, ele só roda o catch() msm. Fui no Log, também não ter erro, mas no run dá o segunte:

> Build Date                       : 12/27/18
> OpenGL ES Shader Compiler Version: EV031.25.03.02
> Local Branch                     : 
> Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.7.5.R1.09.00.00.464.037
> Remote Branch                    : NONE
> Reconstruct Branch               : NOTHING
> Build Config                     : S L 6.0.7 AArch32
> I/Adreno: PFP: 0x005ff110, ME: 0x005ff066
> I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
> android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
> I/OpenGLRenderer: Initialized EGL, version 1.4
> D/OpenGLRenderer: Swap behavior 2
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@59d2653
> D/OpenGLRenderer: endAllActiveAnimators on 0x8aeb3100 (RippleDrawable) with handle 0x8aed2930
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@f47a498
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@db8575c
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@ced9103
> W/System.err: java.io.FileNotFoundException: /storage/emulated/0/BACKUP_APP_ESCOLA (Is a directory)
> W/System.err:     at java.io.FileInputStream.open0(Native Method)
> W/System.err:     at java.io.FileInputStream.open(FileInputStream.java:231)
>     at java.io.FileInputStream.<init>(FileInputStream.java:165)
>     at sistema.escola.BancoDeDados.importacaoBanco(BancoDeDados.java:253)
>     at sistema.escola.UploadDoBanco$1.onClick(UploadDoBanco.java:36)
>     at android.view.View.performClick(View.java:6600)
>     at android.view.View.performClickInternal(View.java:6577)
>     at android.view.View.access$3100(View.java:781)
> W/System.err:     at android.view.View$PerformClick.run(View.java:25912)
>     at android.os.Handler.handleCallback(Handler.java:873)
>     at android.os.Handler.dispatchMessage(Handler.java:99)
>     at android.os.Looper.loop(Looper.java:193)
>     at android.app.ActivityThread.main(ActivityThread.java:6923)
>     at java.lang.reflect.Method.invoke(Native Method)
>     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
> W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)

Ele disse que é uma pasta em:

/storage/emulated/0/BACKUP_APP_ESCOLA (Is a directory)

Daí fiz assim:

public String importacaoBanco() {
    String retorno = null;

    File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");
    File arquivoDestinoSistema = new File(Environment.getDataDirectory()+"//data/data/sistema.escola/databases/Escola.db");

    try {
        FileChannel input = new FileInputStream(arquivoDeOrigem).getChannel();
        FileChannel Output = new FileOutputStream(arquivoDestinoSistema).getChannel();

        Output.transferFrom(input, 0, input.size());
        input.close();
        Output.close();

        return retorno = "UPLOAD REALIZADO COM SUCESSO!";
    }
    catch (IOException e) {
        e.printStackTrace();
        return retorno = "UPLOAD NÃO REALIZADO!";
    }
}

alterei a pastaOrigem para arquivoDeOrigem:

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

Continua rodando o catch(), mas dessa vez o input rodou e parou no output. Segue o Run:

    Accessing hidden field Landroid/graphics/Insets;->left:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->right:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->top:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->bottom:I (light greylist, linking)
W/sistema.escola: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/widget/TextView;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic; (light greylist, linking)
W/sistema.escola: Accessing hidden method Landroid/graphics/FontFamily;-><init>()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->freeze()Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->abortCreation()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/graphics/Typeface;->createFromFamiliesWithDefault([Landroid/graphics/FontFamily;Ljava/lang/String;II)Landroid/graphics/Typeface; (light greylist, reflection)
D/OpenGLRenderer: Skia GL Pipeline
I/Adreno: QUALCOMM build                   : 7adeec4758, I21281c58c8
    Build Date                       : 12/27/18
    OpenGL ES Shader Compiler Version: EV031.25.03.02
    Local Branch                     : 
    Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.7.5.R1.09.00.00.464.037
    Remote Branch                    : NONE
    Reconstruct Branch               : NOTHING
    Build Config                     : S L 6.0.7 AArch32
I/Adreno: PFP: 0x005ff110, ME: 0x005ff066
I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
    android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 2
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@59d2653
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@33a2212
W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)
W/System.err:     at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:308)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
        at sistema.escola.BancoDeDados.importacaoBanco(BancoDeDados.java:254)
        at sistema.escola.UploadDoBanco$1.onClick(UploadDoBanco.java:36)
W/System.err:     at android.view.View.performClick(View.java:6600)
        at android.view.View.performClickInternal(View.java:6577)
        at android.view.View.access$3100(View.java:781)
W/System.err:     at android.view.View$PerformClick.run(View.java:25912)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6923)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)

Tem dizendo assim:

W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)
W/System.err:     at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:308)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
        at sistema.escola.BancoDeDados.importacaoBanco(BancoDeDados.java:254)
        at sistema.escola.UploadDoBanco$1.onClick(UploadDoBanco.java:36)

(No such file or directory)

Mas o arquivo foi exportado e está na memória externa do celular, com os valores corretos.

é isso msm, vc ta querendo copiar a pasta, copia o arquivo:

 File pastaOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/nomedoarquivo.extensao");

Então…

Fiz:

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

Ele diz:

W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)

Mas, tipo, a pasta

"//data/data/sistema.escola/databases/Escola.db"

existe! É nela que o banco de dados do app está salvo. Por isso até comentei que acho que ele será substituído pelo backup, daí terei o conteúdo que foi salvo.

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

Arquivo de backup é o nome do seu arquivo? como vc ta escrevendo de fato? O erro ta falando uma coisa e o código outra.

vc quer copiar a pasta ou o arquivo?

BACKUP_APP_ESCOLA é o nome da PASTA, ARQUIVO_DE_BACKUP o nome do ARQUIVO que foi copiado para a memória externa do celular. É ele, ARQUIVO_DE_BACKUP, que quero salvar na pasta do sistema do app.

olha, pensa comigo:

nome da pasta:

nome do arquivo:

Erro:

o nome da pasta é:

sistema.escola/databases/

nome do arquivo é:

Escola.db

Entendeu?

Ata, entendi agora…

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

faz o q fizemos ontem:

File arquivoDestino.....
if(!arquivoDestino.exists()){
    arquivoDestino.mkdir();
}

Então,

BACKUP_APP_ESCOLA é o nome da PASTA e ARQUIVO_DE_BACKUP o nome do ARQUIVO (DA MEMÓRIA EXTERNA) eu tô querendo passar ele pra o sistema que é sistema.escola/databases/Escola.db (pasta e arquivo juntos)

orochimaru, a pasta do sistema já existe, ela é do sistema, não foi apagada em nenhum momento. Eu só copiei o arquivo que tinha nela para a memória externa do celular, só.

Fiz oq vc falou e continua na msm:

W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)

Será que com o getFileDir() resolveria? Como seria seu uso?

testei metodo aqui e funcionou:

private void copiarArquivo() {
    String arquivo_origem = Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP";
    String arquivo_final = Environment.getDataDirectory() + "//data/data/sistema.escola/databases/Escola.db";
    //arquivo de origem n tem extensao e o arquivo final tem (?????)
    
    InputStream in = null;
    OutputStream out = null;
    try {
        File dir = new File(arquivo_final);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        in = new FileInputStream(arquivo_origem);
        out = new FileOutputStream(arquivo_final);

        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
        in.close();
        in = null;

        out.flush();
        out.close();
        out = null;

    } catch (FileNotFoundException e) {
        Log.e("tag", e.getMessage());
    } catch (Exception e) {
        Log.e("tag", e.getMessage());
    }

}

Não rodou e deu esse erro:

E/tag: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)

lista as pastas por favor:

    private void listarPastas() {
        String path = Environment.getDataDirectory() + "//data/data/";
        Log.d("Files", "Path: " + path);
        File directory = new File(path);
        File[] files = directory.listFiles();
        Log.d("Files", "Size: " + files.length);
        for (int i = 0; i < files.length; i++) {
            Log.d("Files", "FileName:" + files[i].getName());
        }
    }

Só troquei o private pelo public pq, como a exportação, a importação tbm está sendo chamada no button de outra classe, mas o erro é na classe em que o código está sendo implementado.

Simplesmente fecha a aplicação. Mas continua execultando o app no run.

Eu tenho ctz q sua pasta nao existe…

Tenta assim pra vc ver:

public void listarPastas() {
    String path = Environment.getExternalStorageDirectory().toString() + "//data/data";
    File directory = new File(path);
    if (!directory.exists()) {
        System.out.println("pasta n existe");
        if(directory.mkdir()){
            System.out.println("criei a pasta");
        }
    }

    System.out.println(directory.getAbsolutePath());
    File[] files = directory.listFiles();
    for (int i = 0; i < files.length; i++) {
        System.out.println(files[i].getName());
    }
}

A pasta que me refiro é esta:

Ela sempre existe no sistema do app. É nela que é guardado o Banco de dados (SQLite) Escola.db , foi dela que eu exportei o arquivo, ela não foi excluída.

No run tem o seguinte:

Mas tipo a pasta que vc criou foi a /data/data , ela não se encontra no Device File Explorer.

private void listarPastas() {
    String minha_pasta = getApplicationInfo().dataDir + "/databases/";
    File file = new File(minha_pasta);
    System.out.println("PASTA DO APP:::" + minha_pasta );
    System.out.println(file.getAbsolutePath());
    File[] files = file.listFiles();
    for (int i = 0; i < files.length; i++) {
        System.out.println(files[i].getName());
    }
}

AGORA VAI, SE NAO FOR VC JOGA O PC FORA

kkkkkk…

De onde vc tirou o getApplicationInfo() ?

image

esqueci q vc n ta usando isso na activity, faz assim:

private void listarPastas(Context context) {
    String minha_pasta = context.getApplicationInfo().dataDir + "/databases/";
....
}

aí pra chamar vc faz:

listarPastas(this);