【问题标题】:get name and full path of a file获取文件的名称和完整路径
【发布时间】:2016-12-14 05:38:26
【问题描述】:

我使用 Intent ACTION_GET_CONTENT 显示手机内存中的最近文件。这包括图像、pdf、谷歌驱动器文档(pdf、xlsx),如下面的屏幕截图所示。我想获取名称和完整路径,以便可以将文件上传到服务器。到目前为止,我/正在正确获取 mime 类型。

public class MainActivity extends AppCompatActivity {

    Button btn;
    TextView txt;
    private final static int EXTERNAL = 111;
    private final static int ATTACH = 11;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button)findViewById(R.id.btn);
        txt = (TextView)findViewById(R.id.txt);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                        photoIntent();
                    } else {
                        if (shouldShowRequestPermissionRationale(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                            // showToast("Permission Required...");
                        }
                        requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL);
                    }


                } else {

                    photoIntent();
                }
            }
        });



    }

    private void photoIntent() {
        Intent intent = new Intent();
        Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath());
        intent.setDataAndType(uri, "*/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Complete action using"), ATTACH);
    }

    @Override
    public void onRequestPermissionsResult(int requestcode, String[] permission, int[] grantRes){

        if (requestcode == EXTERNAL) {
            if (grantRes[0] == PackageManager.PERMISSION_GRANTED) {
                photoIntent();
            } else {
                Toast.makeText(this, "Unable to Access Image", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == ATTACH && resultCode == RESULT_OK){
            Uri uri = data.getData();
            System.out.println("sammy_sourceUri "+uri);
            String mimeType = getContentResolver().getType(uri);
            System.out.println("sammy_mimeType "+ mimeType);
            


        }

    }
}

【问题讨论】:

  • 没有真正的路径。只需使用ContentResolver.openInputStream()
  • 我们可以使用 `ContentResolver.openInputStream()` 将文件(zip 文件或 google 驱动器文件)上传到服务器吗? @ianhanniballake
  • 好吧,您可以完全访问所选文件的内容
  • 假设我得到了谷歌驱动器pdf或xlsx的InputStream,但是如何使用这个InputStream作为文件上传到服务器API?我是否需要将 InputStream 转换为文件或 ByteArrayBody 才能上传? @ianhanniballake

标签: android file android-internal-storage


【解决方案1】:

我想获取名称和完整路径,以便我可以将文件上传到服务器

没有“完整路径”,因为可能没有“文件”。

您正在调用ACTION_GET_CONTENT。这会将 Uri 返回到某些内容。该内容的来源取决于用户选择的ACTION_GET_CONTENT 活动的开发人员。那可能是:

  • 文件系统上的一个普通文件,恰好是您可以访问的文件
  • 文件系统上的普通文件,驻留在您无法访问的某个位置,例如其他应用的内部存储
  • 需要某种转换才能有用的文件,例如解密
  • 数据库中的BLOB
  • 动态生成的内容,即 Stack Overflow 服务器动态生成此网页的方式
  • 等等

要使用来自Uri 的内容,请使用ContentResolveropenInputStream()

如何使用这个 InputStream 作为文件上传到服务器 API?

您选择的 HTTP API 要么支持 InputStream 作为此内容的来源,要么不支持。如果是这样,请直接使用InputStream。如果没有,请使用InputStream 将内容的临时副本制作为您可以 直接访问的文件(例如,在getCacheDir() 中),上传该文件,然后在上传完成。

【讨论】:

    【解决方案2】:

    试试这个

      public static ArrayList<String> getImagesFromCameraDir(Context context) {
            Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            ArrayList<String> filePaths = new ArrayList<>();
            final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED};
            Cursor mCursor = context.getContentResolver().query(mImageUri, columns, MediaStore.Images.Media.DATA + " like ? ", new String[]{"%/DCIM/%"}, null);
            if (mCursor != null) {
                mCursor.moveToFirst();
    
                try {
                    int uploadImage = 0;
                    uploadImage = mCursor.getCount();
                    for (int index = 0; index < uploadImage; index++) {
                        mCursor.moveToPosition(index);
                        int idx = mCursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                        filePaths.add(mCursor.getString(idx));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    mCursor.close();
                }
            }
            return filePaths;
        }
    

    【讨论】:

    • 如果文件不是图像怎么办?那就是问题所在。可能是 google 驱动器文件或 zip 文件或简单的 pdf。 @UmaAchanta
    【解决方案3】:

    从 URI 获取真实路径

    public String getRealPathFromURI(Uri contentUri) 
    {
         String[] proj = { MediaStore.Audio.Media.DATA };
         Cursor cursor = managedQuery(contentUri, proj, null, null, null);
         int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
         cursor.moveToFirst();
         return cursor.getString(column_index);
    }
    

    文件名:

    String filename = path.substring(path.lastIndexOf("/")+1);
    

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 2011-07-10
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多