我如何从意图中获取 Uri?

Evg*_*oDi 4 android android-intent android-camera

我做了

@Override
public void onClick(View v) {
    switch (v.getId()){
        //???? ??????? ?????? - ????????? ??
        case R.id.b_camera:
            //uri = generateFileUri();
            if (uri == null) {
                Toast.makeText(getView().getContext(), getResources().getString(R.string.sdnot), Toast.LENGTH_LONG).show();
                return;
            }
            Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            //intentCamera.putExtra("return-data", true);
            startActivityForResult(intentCamera, PHOTO_INTENT_REQUEST_CODE);
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 onCreateView() 中调用方法 generateFileUri()。Line intentCamera.putExtra("return-data", true); 对我不起作用(如果在 getParceble() 处使用“返回数据”作为 onActivityResult 中的键)。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturned) {

    switch (requestCode) {

        //???? ????????? ?????? ?? ??????
        case PHOTO_INTENT_REQUEST_CODE:
            if (resultCode == getActivity().RESULT_OK) {
                Log.i("HHHHHHHHHHHH", "result ok");
                //????????? uri ????? ?? ???????
                Uri selectedImage = imageReturned.getData();
                Log.i("HHHHHHHHHHHH", "getdata works!");
                //??????? ?????? ??? ??????? ????? ????????
                Intent last_intent_photo = new Intent(getView().getContext(), ViewPhoto.class);
                //???????? ? ?????? ???? uri
                last_intent_photo.putExtra("fotka",selectedImage);
                //???????? ????? ????????
                startActivity(last_intent_photo);

            } else if (resultCode == getActivity().RESULT_CANCELED)
                Toast.makeText(getView().getContext(), "Capture cancelled", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getView().getContext(), "Capture failed", Toast.LENGTH_LONG).show();
                break;
        default: super.onActivityResult(requestCode, resultCode, imageReturned);

    }
}
Run Code Online (Sandbox Code Playgroud)

我看到日志“结果正常”。我认为这意味着相机运行良好。但后来我看到: 未能传递结果 ResultInfo{who=android:fragment:2, request=100, result=-1, data=null}。怎么可能?!

好吧,我试过 Uri selectedImage = imageReturned.getExtras().getParcelable(); 但我没有打算将其放入 getParcelable(String key) 中。

那么,为什么结果没问题,但 data=null 呢?

Dig*_*iro 8

选项1:

//Uri myUri = ...
intent.setData(myUri);
Run Code Online (Sandbox Code Playgroud)

Uri uri = intent.getData();
Run Code Online (Sandbox Code Playgroud)

选项 2:

根据文档:

toString() - 返回此 URI 的编码字符串表示

//Uri myUri = ...
intent.putStringExtra("uri",myUri.toString());
Run Code Online (Sandbox Code Playgroud)

String uriString = intent.getStringExtra("uri");
Uri uri = Uri.parse(uriString);
Run Code Online (Sandbox Code Playgroud)


Ole*_*dov 2

既然你自己通过了,为什么还需要获取urifrom呢?intert只需使用与以下相同的uri内容:

\n\n
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);\n
Run Code Online (Sandbox Code Playgroud)\n\n

UPD澄清

\n\n

当您使用选项启动cameta时:

\n\n
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);\n
Run Code Online (Sandbox Code Playgroud)\n\n

您告诉相机照片必须存储在该路径中。因此,如果结果正常,您需要通过此 uri 获取该照片。

\n\n
 if (resultCode == getActivity().RESULT_OK) {\n    Log.i("HHHHHHHHHHHH", "result ok");\n\n    // same as passed in intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);\n    Uri selectedImage = uri; \n\n    Log.i("HHHHHHHHHHHH", "getdata works!");\n    //\xd1\x81\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xb5\xd0\xbc \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd0\xbd\xd1\x82 \xd0\xb4\xd0\xbb\xd1\x8f \xd0\xb7\xd0\xb0\xd0\xbf\xd1\x83\xd1\x81\xd0\xba\xd0\xb0 \xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbe\xd0\xb9 \xd0\xb0\xd0\xba\xd1\x82\xd0\xb8\xd0\xb2\xd0\xb8\xd1\x82\xd0\xb8\n    Intent last_intent_photo = new Intent(getView().getContext(), ViewPhoto.class);\n    //\xd0\xbf\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x89\xd0\xb0\xd0\xb5\xd0\xbc \xd0\xb2 \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd0\xbd\xd1\x82 \xd1\x8d\xd1\x82\xd0\xbe\xd1\x82 uri\n    last_intent_photo.putExtra("fotka",selectedImage);\n    //\xd1\x81\xd1\x82\xd0\xb0\xd1\x80\xd1\x82\xd1\x83\xd0\xb5\xd0\xbc \xd0\xbd\xd0\xbe\xd0\xb2\xd1\x83\xd1\x8e \xd0\xb0\xd0\xba\xd1\x82\xd0\xb8\xd0\xb2\xd0\xb8\xd1\x82\xd0\xb8\n    startActivity(last_intent_photo);\n} \n
Run Code Online (Sandbox Code Playgroud)\n\n

更新2

\n\n

FragmentScaling.onActivityCreated:

\n\n
@Override\npublic void onActivityCreated(Bundle savedInstanceState) {\n    super.onActivityCreated(savedInstanceState);\n\n    if (getActivity().getIntent().hasExtra("uri")) {\n        uri = (Uri)getActivity().getIntent().getParcelableExtra("uri");\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n