获取文件的名称和完整路径

时间:2016-12-14 05:38:26

标签: android file android-internal-storage

我使用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);
            


        }

    }
}




enter image description here

3 个答案:

答案 0 :(得分:1)

  

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

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

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

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

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

  

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

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

答案 1 :(得分:0)

试试这个

  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;
    }

答案 2 :(得分:0)

从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);
}

FILENAME:

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