如何将 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