1

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


        }

    }
}

在此处输入图像描述

4

3 回答 3

1

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

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

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

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

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

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

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

于 2016-12-14T11:17:20.017 回答
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;
    }
于 2016-12-14T05:50:46.247 回答
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);
}

文件名 :

String filename = path.substring(path.lastIndexOf("/")+1);
于 2016-12-14T11:50:34.553 回答