Escolha qualquer tipo de arquivo por meio de um Intent no Android

95

Eu gostaria de iniciar um intentchooser para aplicativos que podem retornar qualquer tipo de arquivo

Atualmente eu uso (que copiei do código-fonte de e-mail do Android para anexo de arquivo)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

Mas ele só mostra "Galeria" e "Reprodutor de música" no meu Galaxy S2. Há um explorador de arquivos neste dispositivo e gostaria que ele aparecesse na lista. Também gostaria que o aplicativo da câmera aparecesse na lista, para que o usuário pudesse tirar uma foto e enviá-la pelo meu aplicativo. Se eu instalar o gerenciador de arquivos Astro, ele responderá a essa intenção também. Meus clientes são proprietários apenas de Galaxy SII e não quero forçá-los a instalar o gerenciador de arquivos Astro, pois eles já têm um gerenciador de arquivos básico, mas suficiente.

Alguma ideia de como eu poderia conseguir isso? Tenho quase certeza de que já vi o gerenciador de arquivos padrão aparecer nesse menu para escolher um arquivo, mas não consigo lembrar em qual app.

ErGo_404
fonte
Você precisará de um código muito diferente para tirar uma foto e depois para escolher um arquivo. Na verdade, não acho que a maioria dos exploradores de arquivos possa retornar um arquivo, mas posso estar errado.
dtech de
Você pode especificar quais tipos de arquivos você precisa acessar principalmente?
subrussn90
1
@dtech: Não espero que o explorador de arquivos retorne o arquivo, só preciso do caminho.
ErGo_404
@ subrussn90: Preciso deixar o usuário escolher qualquer tipo de arquivo. Pode ser pdfs, .doc, .zip, QUALQUER tipo de arquivo.
ErGo_404
é suficiente obter o Uri do arquivo especificado no cartão SD ???
subrussn90

Respostas:

88

Não para a câmera, mas para outros arquivos ..

No meu dispositivo eu ES File Explorerinstalei e isso simplesmente funciona no meu caso ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
user370305
fonte
5
Ele funciona com um explorador de arquivos externo (como ES File Explorer ou Astro File Manager, mas não com o gerenciador de arquivos Samsung. Parece estranho que eles não implementaram os filtros de intenção corretos para responder a essa ação.
ErGo_404
@Lukap - Use o gerenciador de arquivos Android de código aberto e integre-o ao seu aplicativo, então você não precisa de nenhum aplicativo de terceiros.
user370305
2
como posso obter o arquivo selecionado? Acho que é o caminho, mas como?
Francisco Corrales Morales
1
@FranciscoCorralesMorales - in onActivityResult()- Você pode obter Urido Arquivo.
user370305
1
PICKFILE_RESULT_CODEdeveria ser PICKFILE_REQUEST_CODE.
Aron Lorincz
50

O explorador de arquivos Samsung não precisa apenas de uma ação personalizada ( com.sec.android.app.myfiles.PICK_DATA ), mas também de parte da categoria (Intent. CATEGORY_DEFAULT ) e do tipo MIME como extra.

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

Você também pode usar esta ação para abrir vários arquivos: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE De qualquer forma, aqui está minha solução que funciona em Samsung e outros dispositivos:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

Esta solução funciona bem para mim e talvez seja útil para outra pessoa.

Chupik
fonte
Quase funciona para mim, exceto pelo fato de que o sIntent, quando iniciado, não aceita nenhum arquivo de qualquer tipo. Posso navegar pelas pastas, mas é isso.
Radu
O problema é que o intent precisa ter mimeType: "file / *", enquanto o Samsung sIntent precisa de "* / *" - sem os espaços entre * / *
Radu
1
E quanto aos outros 11k de dispositivos Android.
Oliver Dixon
1
Como definir URI para este intent, você pode me ajudar?
PriyankaChauhan
1
No caso do Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA"), você pode tentar colocar String extra "FOLDERPATH" ou "START_FOLDER"
Chupik
41

este trabalho para mim no galaxy note seus contatos do show, gerenciadores de arquivos instalados no dispositivo, galeria, reprodutor de música

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

aqui obtém o caminho de entrada onActivityResultda atividade.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}
Alireza
fonte
6
Como converter o uri obtido em util.File?
Anand Savjani de
Não tenho certeza sobre como obter java.io.File, mas pode ser aberto com: developer.android.com/reference/android/content/… Como obter o nome simples está aqui: stackoverflow.com/a/23270545/755313
demaksee
3
como escolher uma pasta?
hornet2319
6

Isso me dá o melhor resultado:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }
Islam Khaled
fonte
Você pode compartilhar seu onActivityResultCode @Islam Khaled
Kishan Donga
1
Veja também org.openintents.action.PICK_FILE para uma terceira opção. openintents.org/action/org-openintents-action-pick-file Seu código também pressupõe que todos em um telefone Samsung usam e (ainda) têm o gerenciador de arquivos Samsung. Usar intent.resolveActivity com a Samsung como alternativa seria mais robusto.
Marcus Wolschon
1

Acontece que o explorador de arquivos Samsung usa uma ação personalizada. É por isso que pude ver o explorador de arquivos Samsung ao procurar um arquivo nos aplicativos Samsung, mas não no meu.

A ação é "com.sec.android.app.myfiles.PICK_DATA"

Criei um selecionador de atividades personalizado que exibe atividades que filtram ambas as intents.

ErGo_404
fonte
Oi, você pode explicar isso um pouco mais? Para telefones Samsung Galaxy eu uso Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); mas causa um erro
steliosf
Não tenho certeza agora, mas posso verificar mais tarde. Acho que é a exceção de atividade não encontrada. Você tem alguma solução de trabalho? Quase tentei de tudo e não consegui consertar
steliosf
Essa intenção funcionou para mim no Galaxy SII. Tentei em um GT-B5510 (Galaxy Y Pro) e não funcionou. Acho que simplesmente não é confiável se você deseja atingir todos os dispositivos Samsung. Acabei integrando um gerenciador de arquivos open source em meu aplicativo, mas é uma solução pesada para uma necessidade tão básica.
ErGo_404
Como definir URI para este intent, você pode me ajudar?
PriyankaChauhan
0

Se você quiser saber disso, existe uma biblioteca de código aberto chamada aFileDialog que é uma pequena e fácil de usar que fornece um seletor de arquivos.

A diferença com as bibliotecas de outro seletor de arquivos para Android é que aFileDialog oferece a opção de abrir o seletor de arquivos como um diálogo e uma atividade.

Também permite selecionar pastas, criar arquivos, filtrar arquivos usando expressões regulares e mostrar diálogos de confirmação.

Danigonlinea
fonte