Android 应用开发 - 文件选择器


本地文件读取是开发中常用的功能,这里介绍一个使用系统本地的文件管理器去选择需要的文件。代码如下:

1. Activity 定义的返回接收函数和点击触发函数:

 
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     super.onActivityResult(requestCode, resultCode, data);  
  4.     Log.e(TAG,"onActivityResult:" + "requestCode " + requestCode + " resultCode " + resultCode);  
  5.     switch (requestCode){  
  6.         case REQUEST_FILE_CHOOSE:  
  7.             if(resultCode == Activity.RESULT_OK){  
  8.                 /* 使用系统的文件选择器*/  
  9.                 try {  
  10.                     Uri uri = data.getData();//得到uri,后面就是将uri转化成file的过程。  
  11.                     String path = FileChooseUtil.getPath(this,uri);  
  12.                     Log.e(TAG,"getPath:" + path);  
  13.                     if(!isBookDuplicate(path)) {  
  14.                         File file = new File(path);  
  15.                         Book book = getFileInfo(file);  
  16.                         book_list.add(book);  
  17.                         updateConfigFile();  
  18.                         updateBookListView();  
  19.                         Toast.makeText(this"你已成功导入一本新书了!", Toast.LENGTH_SHORT).show();  
  20.                     }else {  
  21.                         Toast.makeText(this"这个书你已经在看了!", Toast.LENGTH_SHORT).show();  
  22.                     }  
  23.                 } catch (Exception e) {  
  24.                     Toast.makeText(this"这个书看不了!"+ e.getMessage(), Toast.LENGTH_SHORT).show();  
  25.                 }  
  26.             }  
  27.             break;  
  28.         default  
  29.             break;  
  30.     }  
  31. }  
 
  1. button_add.setOnClickListener(new View.OnClickListener() {  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         /* 使用系统的文件选择器 */  
  5.         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);  
  6.         intent.setType("text/plain");//设置类型  
  7.         intent.addCategory(Intent.CATEGORY_OPENABLE);  
  8.         startActivityForResult(intent, REQUEST_FILE_CHOOSE);  
  9.         }  
  10. });  

2. 新建一个FileChooseUtil来处理不同sdk版本下的文件路径获取:

  1. import android.annotation.SuppressLint;  
  2. import android.content.ContentUris;  
  3. import android.content.Context;  
  4. import android.database.Cursor;  
  5. import android.net.Uri;  
  6. import android.os.Build;  
  7. import android.os.Environment;  
  8. import android.provider.DocumentsContract;  
  9. import android.provider.MediaStore;  
  10.   
  11.   
  12. @SuppressLint("NewApi")  
  13. public class FileChooseUtil {  
  14.   
  15.     /** 
  16.      * Get a file path from a Uri. This will get the the path for Storage Access 
  17.      * Framework Documents, as well as the _data field for the MediaStore and 
  18.      * other file-based ContentProviders. 
  19.      * 
  20.      * @param context The context. 
  21.      * @param uri The Uri to query. 
  22.      */  
  23.     public static String getPath(final Context context, final Uri uri) {  
  24.   
  25.         final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;  
  26.   
  27.         // DocumentProvider  
  28.         if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {  
  29.             // ExternalStorageProvider  
  30.             if (isExternalStorageDocument(uri)) {  
  31.                 final String docId = DocumentsContract.getDocumentId(uri);  
  32.                 final String[] split = docId.split(":");  
  33.                 final String type = split[0];  
  34.   
  35.                 if ("primary".equalsIgnoreCase(type)) {  
  36.                     return Environment.getExternalStorageDirectory() + "/" + split[1];  
  37.                 }  
  38.   
  39.                 // TODO handle non-primary volumes  
  40.             }  
  41.             // DownloadsProvider  
  42.             else if (isDownloadsDocument(uri)) {  
  43.   
  44.                 final String id = DocumentsContract.getDocumentId(uri);  
  45.                 final Uri contentUri = ContentUris.withAppendedId(  
  46.                         Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));  
  47.   
  48.                 return getDataColumn(context, contentUri, nullnull);  
  49.             }  
  50.             // MediaProvider  
  51.             else if (isMediaDocument(uri)) {  
  52.                 final String docId = DocumentsContract.getDocumentId(uri);  
  53.                 final String[] split = docId.split(":");  
  54.                 final String type = split[0];  
  55.   
  56.                 Uri contentUri = null;  
  57.                 if ("image".equals(type)) {  
  58.                     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;  
  59.                 } else if ("video".equals(type)) {  
  60.                     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;  
  61.                 } else if ("audio".equals(type)) {  
  62.                     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  
  63.                 }  
  64.   
  65.                 final String selection = "_id=?";  
  66.                 final String[] selectionArgs = new String[] {  
  67.                         split[1]  
  68.                 };  
  69.   
  70.                 return getDataColumn(context, contentUri, selection, selectionArgs);  
  71.             }  
  72.         }  
  73.         // MediaStore (and general)  
  74.         else if ("content".equalsIgnoreCase(uri.getScheme())) {  
  75.             return getDataColumn(context, uri, nullnull);  
  76.         }  
  77.         // File  
  78.         else if ("file".equalsIgnoreCase(uri.getScheme())) {  
  79.             return uri.getPath();  
  80.         }  
  81.   
  82.         return null;  
  83.     }  
  84.   
  85.     /** 
  86.      * Get the value of the data column for this Uri. This is useful for 
  87.      * MediaStore Uris, and other file-based ContentProviders. 
  88.      * 
  89.      * @param context The context. 
  90.      * @param uri The Uri to query. 
  91.      * @param selection (Optional) Filter used in the query. 
  92.      * @param selectionArgs (Optional) Selection arguments used in the query. 
  93.      * @return The value of the _data column, which is typically a file path. 
  94.      */  
  95.     public static String getDataColumn(Context context, Uri uri, String selection,  
  96.                                        String[] selectionArgs) {  
  97.   
  98.         Cursor cursor = null;  
  99.         final String column = "_data";  
  100.         final String[] projection = {  
  101.                 column  
  102.         };  
  103.   
  104.         try {  
  105.             cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,  
  106.                     null);  
  107.             if (cursor != null && cursor.moveToFirst()) {  
  108.                 final int column_index = cursor.getColumnIndexOrThrow(column);  
  109.                 return cursor.getString(column_index);  
  110.             }  
  111.         } finally {  
  112.             if (cursor != null)  
  113.                 cursor.close();  
  114.         }  
  115.         return null;  
  116.     }  
  117.   
  118.   
  119.     /** 
  120.      * @param uri The Uri to check. 
  121.      * @return Whether the Uri authority is ExternalStorageProvider. 
  122.      */  
  123.     public static boolean isExternalStorageDocument(Uri uri) {  
  124.         return "com.android.externalstorage.documents".equals(uri.getAuthority());  
  125.     }  
  126.   
  127.     /** 
  128.      * @param uri The Uri to check. 
  129.      * @return Whether the Uri authority is DownloadsProvider. 
  130.      */  
  131.     public static boolean isDownloadsDocument(Uri uri) {  
  132.         return "com.android.providers.downloads.documents".equals(uri.getAuthority());  
  133.     }  
  134.   
  135.     /** 
  136.      * @param uri The Uri to check. 
  137.      * @return Whether the Uri authority is MediaProvider. 
  138.      */  
  139.     public static boolean isMediaDocument(Uri uri) {  
  140.         return "com.android.providers.media.documents".equals(uri.getAuthority());  
  141.     }  
  142.   
  143. }  

以上就可以进行简单的文件选择

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/android-app-file-choosen.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注