인 텐트에 URI를 전달하는 방법은 무엇입니까?


99

다른 활동에서 해당 URI를 사용하기 위해 URI-Object를 내 Intent에 전달하려고합니다.

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 ...

감사합니다



답변:


178

URI를 문자열로 저장할 수 있습니다.

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

그런 다음 문자열을 다음과 같이 다시 uri로 변환하십시오.

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

2
좋아 멋지다 ...하지만 uri를 문자열로 저장하는 방법을 모르겠습니다 :(
Robert El

위의 코드에서 문자열로 변환되었습니다. imageuri.toString ()은 uri를 문자열로 변환합니다.
Rufflez

1
@malclocke에는 더 나은 솔루션이 있습니다. 수동으로 문자열로 변환 할 필요가 없습니다.
clocksmith

intent.setData (imageUri); 사용할 수 있습니다.
Buntupana

1
잠시 동안 "추가"가 무엇을 의미하는지 궁금했습니다. 간단히 말해서 : intent.putExtra("imageUrl", mImageUri.toString()); 다른 활동에서 String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

136

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.


10
미래의 사람에게 힌트 : 메이크업은 당신이 사용하고 android.net.Uri하지 java.net.URI!
Caleb Jares 2014 년

4
나중에 참조 할 수 있도록를 사용하기 전에 Bundle 객체에 몇 가지 추가 항목을 넣는 경우 객체 에서 직접 intent.putExtras(bundle);사용하는 bundle.putParcelable("imageUri", uri);대신 사용 intent.putExtra(...);하세요 Intent.
Armando

배열도 작동합니다! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

퍼팅이 오류가있어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
오마르 Boshra

52

Intent에서는 Uri를 직접 넣을 수 있습니다. Uri를 문자열로 변환하고 다시 Uri로 변환 할 필요가 없습니다.

이 간단한 접근 방식을보십시오.

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

그리고 Uri를 의도에서 되돌리려면 :

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

1
경고 : 위의 답변 / 해결 방법은 수신되지 않을 수 있으므로 지역 방송에 사용해서는 안됩니다. 지역 방송의 경우 malclocke의 답변 : stackoverflow.com/a/13981436/1617737 을 사용하는 것이 좋습니다 .
ban-geoengineering

1
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"));

1

여기서 내가 어떻게 사용하는지; 카메라를 호출하는 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 활동 클래스

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

1

표준 추가 데이터 필드를 사용하려면 다음과 같이하십시오.

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"

내장 된 표준 이름을 사용할 필요는 없지만 아마도 좋은 습관이고 재사용이 가능할 것입니다. 모든 기본 제공 표준 추가 데이터 필드 목록은 개발자 문서를 참조하십시오.


0

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");

이것은 문제를 해결했습니다.


-2

이렇게 할 수 있습니다. imageuri는 이와 같이 문자열로 변환 할 수 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.