别人家的Android开发经验

Android 选择文件并获取路径

2016-12-19  本文已影响9346人  Thresh0ld

参见StackOverflow

想必看到这篇文章的码友们估计都被Android获取选择的文件的路径坑过。具体是怎么被坑的呢:有的文件管理器返回的是content://协议,还有的返回的是file://协议。

废话不多说上代码。

一. 请求选择文件

private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() { 
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
  intent.setType("*/*"); 
  intent.addCategory(Intent.CATEGORY_OPENABLE); 
  try { 
      startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE); 
  } catch (android.content.ActivityNotFoundException ex) { 
    // Potentially direct the user to the Market with a Dialog 
    Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show(); 
  }
}

二. 处理选择文件的回调

private static final String TAG = "ChooseFile";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
  switch (requestCode) { 
      case FILE_SELECT_CODE: 
          if (resultCode == RESULT_OK) { 
              // Get the Uri of the selected file  
            Uri uri = data.getData(); 
            Log.d(TAG, "File Uri: " + uri.toString()); 
            // Get the path 
            String path = FileUtils.getPath(this, uri);
            Log.d(TAG, "File Path: " + path); 
            // Get the file instance 
            // File file = new File(path); 
            // Initiate the upload 
      } 
    break; 
  } 
  super.onActivityResult(requestCode, resultCode, data);
}

三. 对于第二步中的FileUtils.getPath代码如下

public static String getPath(Context context, Uri uri) throws URISyntaxException { 
  if ("content".equalsIgnoreCase(uri.getScheme())) {
   String[] projection = { "_data" }; 
   Cursor cursor = null; 
   try { 
    cursor = context.getContentResolver().query(uri, projection, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow("_data"); 
    if (cursor.moveToFirst()) { 
        return cursor.getString(column_index); 
      } 
   } catch (Exception e) { 
      // Eat it  Or Log it.
    } 
  } else if ("file".equalsIgnoreCase(uri.getScheme())) { 
    return uri.getPath(); 
  } 
  return null;
}

这段代码就是从Uri中获取文件路径的。

主要做了两个判断操作:

  1. 判断协议是不是content://开头,有的话就用ContentResolver去query查询文件真实位置。
  2. 判断协议是不是file://开头,如果是,那么uri.getPath()就是文件的真实路径。
    大家可以新建个FileUtils类,然后把上面的getPath()方法拷贝进去。

关注我的公众号.jpg
上一篇下一篇

猜你喜欢

热点阅读