Elegir diálogo de archivo
¿Alguien sabe de un cuadro de diálogo completo elegir archivo? Tal vez uno donde se puede filtrar todos los archivos, excepto para aquellos con extensiones específicas?
No he encontrado nada lo suficientemente ligero como para implementar fácilmente en uno de mis proyectos. La única otra opción parece estar utilizando las intenciones abiertas de OI FileManager, pero eso requiere que el usuario ya tenga instalado el administrador de archivos.
- ZXing doble imagen / superposición después de escanear
- Uso de zxing Barcode Scanner dentro de una página web
- Lectura de códigos de barras con android
- Cómo usar la biblioteca de ZXing sin instalar la aplicación barcodescanner
- Controlar el valor del escáner de código de barras a través del dispositivo Android
Estaría agradecido si alguien pudiera señalar un cuadro de diálogo que permitiría al usuario examinar carpetas y seleccionar un archivo, y devolver la ruta.
- Lector de códigos de barras / Qr para Android
- ¿Por qué setColor es tan lento en Android?
- Escáner de código de barras ZXing Propósito: set DecodeHintType.ASSUME_GS1
- Disposición de Android: ¿Es posible la UI de componente reutilizable?
- ¿Existen directrices de codificación para la plataforma Android que se centran en la seguridad?
- ZXing cómo escanear código QR y código de barras 1D?
- Longitud máxima de un código de barras Código 128
- Comentarios de las muestras de Android BEGIN_INCLUDE END_INCLUDE
Sólo tiene que anular onCreateDialog
en una actividad.
//In an Activity private String[] mFileList; private File mPath = new File(Environment.getExternalStorageDirectory() + "//yourdir//"); private String mChosenFile; private static final String FTYPE = ".txt"; private static final int DIALOG_LOAD_FILE = 1000; private void loadFileList() { try { mPath.mkdirs(); } catch(SecurityException e) { Log.e(TAG, "unable to write on the sd card " + e.toString()); } if(mPath.exists()) { FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File dir, String filename) { File sel = new File(dir, filename); return filename.contains(FTYPE) || sel.isDirectory(); } }; mFileList = mPath.list(filter); } else { mFileList= new String[0]; } } protected Dialog onCreateDialog(int id) { Dialog dialog = null; AlertDialog.Builder builder = new Builder(this); switch(id) { case DIALOG_LOAD_FILE: builder.setTitle("Choose your file"); if(mFileList == null) { Log.e(TAG, "Showing file picker before loading the file list"); dialog = builder.create(); return dialog; } builder.setItems(mFileList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mChosenFile = mFileList[which]; //you can do stuff with the file here too } }); break; } dialog = builder.show(); return dialog; }
Thanx schwiz para la idea! Aquí está la solución modificada:
public class FileDialog { private static final String PARENT_DIR = ".."; private final String TAG = getClass().getName(); private String[] fileList; private File currentPath; public interface FileSelectedListener { void fileSelected(File file); } public interface DirectorySelectedListener { void directorySelected(File directory); } private ListenerList<FileSelectedListener> fileListenerList = new ListenerList<FileDialog.FileSelectedListener>(); private ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<FileDialog.DirectorySelectedListener>(); private final Activity activity; private boolean selectDirectoryOption; private String fileEndsWith; /** * @param activity * @param initialPath */ public FileDialog(Activity activity, File initialPath) { this(activity, initialPath, null); } public FileDialog(Activity activity, File initialPath, String fileEndsWith) { this.activity = activity; setFileEndsWith(fileEndsWith); if (!initialPath.exists()) initialPath = Environment.getExternalStorageDirectory(); loadFileList(initialPath); } /** * @return file dialog */ public Dialog createFileDialog() { Dialog dialog = null; AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(currentPath.getPath()); if (selectDirectoryOption) { builder.setPositiveButton("Select directory", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.d(TAG, currentPath.getPath()); fireDirectorySelectedEvent(currentPath); } }); } builder.setItems(fileList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { String fileChosen = fileList[which]; File chosenFile = getChosenFile(fileChosen); if (chosenFile.isDirectory()) { loadFileList(chosenFile); dialog.cancel(); dialog.dismiss(); showDialog(); } else fireFileSelectedEvent(chosenFile); } }); dialog = builder.show(); return dialog; } public void addFileListener(FileSelectedListener listener) { fileListenerList.add(listener); } public void removeFileListener(FileSelectedListener listener) { fileListenerList.remove(listener); } public void setSelectDirectoryOption(boolean selectDirectoryOption) { this.selectDirectoryOption = selectDirectoryOption; } public void addDirectoryListener(DirectorySelectedListener listener) { dirListenerList.add(listener); } public void removeDirectoryListener(DirectorySelectedListener listener) { dirListenerList.remove(listener); } /** * Show file dialog */ public void showDialog() { createFileDialog().show(); } private void fireFileSelectedEvent(final File file) { fileListenerList.fireEvent(new FireHandler<FileDialog.FileSelectedListener>() { public void fireEvent(FileSelectedListener listener) { listener.fileSelected(file); } }); } private void fireDirectorySelectedEvent(final File directory) { dirListenerList.fireEvent(new FireHandler<FileDialog.DirectorySelectedListener>() { public void fireEvent(DirectorySelectedListener listener) { listener.directorySelected(directory); } }); } private void loadFileList(File path) { this.currentPath = path; List<String> r = new ArrayList<String>(); if (path.exists()) { if (path.getParentFile() != null) r.add(PARENT_DIR); FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String filename) { File sel = new File(dir, filename); if (!sel.canRead()) return false; if (selectDirectoryOption) return sel.isDirectory(); else { boolean endsWith = fileEndsWith != null ? filename.toLowerCase().endsWith(fileEndsWith) : true; return endsWith || sel.isDirectory(); } } }; String[] fileList1 = path.list(filter); for (String file : fileList1) { r.add(file); } } fileList = (String[]) r.toArray(new String[]{}); } private File getChosenFile(String fileChosen) { if (fileChosen.equals(PARENT_DIR)) return currentPath.getParentFile(); else return new File(currentPath, fileChosen); } private void setFileEndsWith(String fileEndsWith) { this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() : fileEndsWith; } } class ListenerList<L> { private List<L> listenerList = new ArrayList<L>(); public interface FireHandler<L> { void fireEvent(L listener); } public void add(L listener) { listenerList.add(listener); } public void fireEvent(FireHandler<L> fireHandler) { List<L> copy = new ArrayList<L>(listenerList); for (L l : copy) { fireHandler.fireEvent(l); } } public void remove(L listener) { listenerList.remove(listener); } public List<L> getListenerList() { return listenerList; } }
Utilícelo en la actividad onCreate (se comenta la opción de selección de directorio):
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); File mPath = new File(Environment.getExternalStorageDirectory() + "//DIR//"); fileDialog = new FileDialog(this, mPath, ".txt"); fileDialog.addFileListener(new FileDialog.FileSelectedListener() { public void fileSelected(File file) { Log.d(getClass().getName(), "selected file " + file.toString()); } }); //fileDialog.addDirectoryListener(new FileDialog.DirectorySelectedListener() { // public void directorySelected(File directory) { // Log.d(getClass().getName(), "selected dir " + directory.toString()); // } //}); //fileDialog.setSelectDirectoryOption(false); fileDialog.showDialog(); }
He creado FolderLayout
que puede ayudarle. Este enlace me ayudó
Folderview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/path" android:text="Path" android:layout_width="match_parent" android:layout_height="wrap_content"></TextView> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/list"></ListView> </LinearLayout>
FolderLayout.java
package com.testsample.activity; public class FolderLayout extends LinearLayout implements OnItemClickListener { Context context; IFolderItemListener folderListener; private List<String> item = null; private List<String> path = null; private String root = "/"; private TextView myPath; private ListView lstView; public FolderLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.context = context; LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = layoutInflater.inflate(R.layout.folderview, this); myPath = (TextView) findViewById(R.id.path); lstView = (ListView) findViewById(R.id.list); Log.i("FolderView", "Constructed"); getDir(root, lstView); } public void setIFolderItemListener(IFolderItemListener folderItemListener) { this.folderListener = folderItemListener; } //Set Directory for view at anytime public void setDir(String dirPath){ getDir(dirPath, lstView); } private void getDir(String dirPath, ListView v) { myPath.setText("Location: " + dirPath); item = new ArrayList<String>(); path = new ArrayList<String>(); File f = new File(dirPath); File[] files = f.listFiles(); if (!dirPath.equals(root)) { item.add(root); path.add(root); item.add("../"); path.add(f.getParent()); } for (int i = 0; i < files.length; i++) { File file = files[i]; path.add(file.getPath()); if (file.isDirectory()) item.add(file.getName() + "/"); else item.add(file.getName()); } Log.i("Folders", files.length + ""); setItemList(item); } //can manually set Item to display, if u want public void setItemList(List<String> item){ ArrayAdapter<String> fileList = new ArrayAdapter<String>(context, R.layout.row, item); lstView.setAdapter(fileList); lstView.setOnItemClickListener(this); } public void onListItemClick(ListView l, View v, int position, long id) { File file = new File(path.get(position)); if (file.isDirectory()) { if (file.canRead()) getDir(path.get(position), l); else { //what to do when folder is unreadable if (folderListener != null) { folderListener.OnCannotFileRead(file); } } } else { //what to do when file is clicked //You can add more,like checking extension,and performing separate actions if (folderListener != null) { folderListener.OnFileClicked(file); } } } public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub onListItemClick((ListView) arg0, arg0, arg2, arg3); } }
Y una Interfaz IFolderItemListener
para agregar qué hacer cuando se hace clic en un fileItem
IFolderItemListener.java
public interface IFolderItemListener { void OnCannotFileRead(File file);//implement what to do folder is Unreadable void OnFileClicked(File file);//What to do When a file is clicked }
También un xml para definir la fila
Row.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rowtext" android:layout_width="fill_parent" android:textSize="23sp" android:layout_height="match_parent"/>
Cómo utilizar en su aplicación
En su xml,
Folders.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="1"> <com.testsample.activity.FolderLayout android:layout_height="match_parent" layout="@layout/folderview" android:layout_weight="0.35" android:layout_width="200dp" android:id="@+id/localfolders"></com.testsample.activity.FolderLayout></LinearLayout>
En su actividad,
SampleFolderActivity.java
public class SampleFolderActivity extends Activity implements IFolderItemListener { FolderLayout localFolders; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); localFolders = (FolderLayout)findViewById(R.id.localfolders); localFolders.setIFolderItemListener(this); localFolders.setDir("./sys");//change directory if u want,default is root } //Your stuff here for Cannot open Folder public void OnCannotFileRead(File file) { // TODO Auto-generated method stub new AlertDialog.Builder(this) .setIcon(R.drawable.icon) .setTitle( "[" + file.getName() + "] folder can't be read!") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } //Your stuff here for file Click public void OnFileClicked(File file) { // TODO Auto-generated method stub new AlertDialog.Builder(this) .setIcon(R.drawable.icon) .setTitle("[" + file.getName() + "]") .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } }
Importe las bibliotecas necesarias. Espero que esto te ayude …
Estaba buscando un explorador de archivos / carpetas yo mismo recientemente y decidí hacer una nueva actividad de explorador (biblioteca de Android): https://github.com/vaal12/AndroidFileBrowser
Aplicación de prueba de coincidencia https://github.com/vaal12/FileBrowserTestApplication- es un ejemplo de cómo usarlo.
Permite seleccionar directorios y archivos de la estructura de archivos del teléfono.
He implementado el diálogo Selector de archivos de Samsung, que proporciona la capacidad de abrir, guardar archivo, filtro de extensión de archivo, y crear nuevo directorio en el mismo diálogo creo que vale la pena tratar Aquí está el enlace que tiene que iniciar sesión en el sitio de desarrollador de Samsung Ver la solución
Agregando a la mezcla: el administrador de archivos OI tiene una api pública registrada en openintents.org
http://www.openintents.org/filemanager
http://www.openintents.org/action/org-openintents-action-pick-file/
- Cómo mostrar siempre la barra de desplazamiento
- Cambiar la configuración regional dentro de la propia aplicación