如何将 URI 传递给意图?

Posted

技术标签:

【中文标题】如何将 URI 传递给意图?【英文标题】:How to pass a URI to an intent? 【发布时间】:2011-12-22 11:23:35 【问题描述】:

我正在尝试将 URI-Object 传递给我的 Intent 以使用该 URI 在另一个活动中。

如何传递 URI?

private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri);
startActivity(intent);
this.finish();

我现在如何在我的其他活动中使用此 URI?

 imageUri = extras.getString("imageUri"); // I know thats wrong ...

【问题讨论】:

How to get extra data from intent in android?的可能重复 How to send an object from one Android Activity to another using Intents?的可能重复 【参考方案1】:

您可以将 uri 存储为字符串

intent.putExtra("imageUri", imageUri.toString());

然后像这样将字符串转换回uri

Uri myUri = Uri.parse(extras.getString("imageUri"));

【讨论】:

好酷...但我不知道如何将 uri 存储为字符串:( 在上面的代码中,它被转换为一个字符串。 imageuri.toString() 正在为您将 uri 转换为字符串。 @malclocke 有更好的解决方案。无需手动转换为字符串并返回。 你可以使用 intent.setData(imageUri); 有一瞬间我想知道“额外”是什么意思。简单来说:intent.putExtra("imageUrl", mImageUri.toString()); 在其他活动中 String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);【参考方案2】:

Uri 类实现了Parcelable,因此您可以直接从Intent 中添加和提取它

// Add a Uri instance to an Intent
intent.putExtra("imageUri", uri);

// Get a Uri from an Intent
Uri uri = intent.getParcelableExtra("imageUri");

您可以对任何实现Parcelable 的对象使用相同的方法,如果需要,您可以在自己的对象上实现Parcelable

【讨论】:

对未来任何人的提示:确保您使用的是android.net.Uri 而不是java.net.URI 为了将来参考,如果您在使用 intent.putExtras(bundle); 之前在 Bundle 对象中添加了多个额外内容,请使用 bundle.putParcelable("imageUri", uri); 而不是直接在 Intent 对象中使用 intent.putExtra(...); 数组也可以! i.putExtra("URIList", uriList.toArray()); -> List<Uri> myList = i.getParcelableArrayListExtra("URIList"); 输入java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Intent.putExtra(java.lang.String, android.os.Parcelable)' on a null object reference时出现此错误【参考方案3】:

Intent中可以直接放Uri。您无需将 Uri 转换为字符串并再次转换回 Uri。

看看这个简单的方法。

// put uri to intent 
intent.setData(imageUri);

并从意图中恢复 Uri:

// Get Uri from Intent
Uri imageUri=getIntent().getData();

【讨论】:

警告:上述答案/解决方案不应用于本地广播,因为您可能会发现它们不会被接收。对于本地广播,最好使用 malclocke 的答案:***.com/a/13981436/1617737。【参考方案4】:
private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra("imageUri", imageUri.toString());
startActivity(intent);
this.finish();

然后你可以像这样获取它:

imageUri = Uri.parse(extras.getString("imageUri"));

【讨论】:

【参考方案5】:

这里是我如何使用它; 我的 CameraActionActivity Activity 类中的这个按钮,我称之为相机

 btn_frag_camera.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intenImatToSec = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                startActivityForResult(intenImatToSec, REQUEST_CODE_VIDEO);
                //intenImatToSec.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                //intenImatToSec.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
                //Toast.makeText(getActivity(), "Hello From Camera", Toast.LENGTH_SHORT).show();
            
        );



@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (resultCode == RESULT_OK) 

            if (requestCode == REQUEST_CODE_IMG) 
                Bundle bundle = data.getExtras();
                Bitmap bitmap = (Bitmap) bundle.get("data");
                Intent intentBitMap = new Intent(getActivity(), DisplayImage.class);
                // aldıgımız imagi burda yonlendirdiğimiz sınıfa iletiyoruz
                ByteArrayOutputStream _bs = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 50, _bs);
                intentBitMap.putExtra("byteArray", _bs.toByteArray());
                startActivity(intentBitMap);

             else if (requestCode == REQUEST_CODE_VIDEO) 
                Uri videoUrl = data.getData();
                Intent intenToDisplayVideo = new Intent(getActivity(), DisplayVideo.class);
                intenToDisplayVideo.putExtra("videoUri", videoUrl.toString());
                startActivity(intenToDisplayVideo);
            
        
    

还有我的其他 DisplayVideo Activity 类

VideoView videoView = (VideoView) findViewById(R.id.videoview_display_video_actvity);
Bundle extras = getIntent().getExtras();
        Uri myUri=  Uri.parse(extras.getString("videoUri"));
        videoView.setVideoURI(myUri);

【讨论】:

【参考方案6】:

如果你想使用标准的额外数据字段,你可以这样做:

private Uri imageUri;
....
Intent intent = new Intent(this, GoogleActivity.class);
intent.putExtra(Intent.EXTRA_STREAM, imageUri.toString());
startActivity(intent);
this.finish();

Intent 的文档说:

EXTRA_STREAM   added in API level 1 
String EXTRA_STREAM
A content: URI holding a stream of data associated with the Intent,
used with ACTION_SEND to supply the data being sent. 

Constant Value: "android.intent.extra.STREAM"

您不必使用内置的标准名称,但这可能是一种很好的做法并且更可重用。查看开发人员文档,了解所有内置标准额外数据字段的列表。

【讨论】:

【参考方案7】:

Uri.parse(extras.getString("imageUri")) 导致错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.content.Intent.putExtra(java.lang.String, android.os.Parcelable)' on a null object reference 

所以我改成如下:

intent.putExtra("imageUri", imageUri)

Uri uri = (Uri) getIntent().get("imageUri");

这解决了问题。

【讨论】:

【参考方案8】:

你可以这样做。 imageuri 可以像这样转换成字符串。

intent.putExtra("imageUri", imageUri.toString());

【讨论】:

以上是关于如何将 URI 传递给意图?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将独特的附加内容传递给待处理的意图?

将捆绑包/意图传递给另一个活动?

如何将活动中的意图传递给已打开的片段

如何在 AndroidManifest 中指定多个活动,一个用于启动屏幕,一个用于 mainactivity - 将原始意图传递给 mainactivy

如何使用意图传递处理程序

无法将 json 传递给另一个活动的意图