จะส่ง URI ไปยัง Intent ได้อย่างไร?


101

ฉันกำลังพยายามส่ง 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 ...

ขอบคุณทุกคน



คำตอบ:


180

คุณสามารถจัดเก็บ uri เป็นสตริงได้

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

แล้วแปลงสตริงกลับเป็น uri แบบนี้

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

2
โอเคเจ๋ง ... แต่ฉันไม่รู้วิธีจัดเก็บอูริเป็นสตริง :(
Robert El

ในโค้ดด้านบนจะแปลงเป็นสตริง imageuri.toString () กำลังแปลง uri เป็นสตริงให้คุณ
Rufflez

1
@malclocke มีทางออกที่ดีกว่า ไม่จำเป็นต้องแปลงเป็นสตริงและย้อนกลับด้วยตนเอง
นาฬิกา

คุณสามารถใช้ Intent.setData (imageUri);
Buntupana

1
ฉันสงสัยอยู่ครู่หนึ่งว่า "พิเศษ" หมายถึงอะไร พูดง่ายๆ: intent.putExtra("imageUrl", mImageUri.toString()); ในกิจกรรมอื่น ๆ String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

139

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

4
สำหรับการอ้างอิงในอนาคตหากคุณกำลังใส่สิ่งพิเศษหลายอย่างในอ็อบเจ็กต์ Bundle ก่อนใช้intent.putExtras(bundle);ให้ใช้bundle.putParcelable("imageUri", uri);แทนการใช้intent.putExtra(...);โดยตรงในIntentอ็อบเจ็กต์
Armando

อาร์เรย์ก็ใช้ได้เช่นกัน! 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
Omar Boshra

53

ใน 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ของฉันที่ฉันเรียกกล้อง

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

วิธีนี้ช่วยแก้ปัญหาได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.