Làm thế nào để chuyển một URI đến một ý định?


98

Tôi đang cố gắng chuyển một đối tượng URI cho Intent của mình để sử dụng URI đó trong một hoạt động khác ...

Làm cách nào để vượt qua URI?

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

Làm cách nào để sử dụng URI này ngay bây giờ trong hoạt động khác của tôi?

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

Cảm ơn các bạn



Câu trả lời:


178

bạn có thể lưu trữ tiểu dưới dạng chuỗi

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

và sau đó chỉ cần chuyển đổi chuỗi trở lại thành uri như thế này

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

2
ok mát mẻ ... nhưng tôi không biết làm thế nào để lưu trữ một uri như là một chuỗi :(
Robert El

Trong đoạn mã trên, nó được chuyển đổi thành một chuỗi. imageuri.toString () đang chuyển đổi tiểu thành một chuỗi cho bạn.
Rufflez

1
@malclocke có một giải pháp tốt hơn. Không cần phải chuyển đổi thủ công sang chuỗi và ngược lại.
thợ đồng hồ

Bạn có thể sử dụng ý định.setData (imageUri);
Buntupana

1
Trong một lúc, tôi đã tự hỏi "tính năng bổ sung" nghĩa là gì. Nói một cách dễ hiểu: intent.putExtra("imageUrl", mImageUri.toString()); Trong hoạt động khác String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
Brian

135

Các Uridụng cụ lớp Parcelable, vì vậy bạn có thể thêm và trích xuất trực tiếp từIntent

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

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

Bạn có thể sử dụng cùng một phương pháp cho bất kỳ đối tượng nào triển khai Parcelablevà bạn có thể triển khai Parcelabletrên các đối tượng của riêng mình nếu cần.


10
Gợi ý cho bất kỳ ai trong tương lai: Hãy chắc chắn rằng bạn đang sử dụng android.net.Urivà không sử dụng java.net.URI!
Caleb Jares

4
Để tham khảo trong tương lai, nếu bạn đặt một số tính năng bổ sung vào một đối tượng Bundle trước khi sử dụng intent.putExtras(bundle);, hãy sử dụng bundle.putParcelable("imageUri", uri);thay vì sử dụng intent.putExtra(...);trực tiếp trong Intentđối tượng.
Armando

Mảng cũng hoạt động! i.putExtra("URIList", uriList.toArray());->List<Uri> myList = i.getParcelableArrayListExtra("URIList");
Pierre

đã nhận lỗi này khi đặtjava.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

52

Trong Intent, bạn có thể đặt trực tiếp Uri. Bạn không cần chuyển đổi Uri thành chuỗi và chuyển đổi lại thành Uri.

Nhìn vào cách tiếp cận đơn giản này.

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

Và để lấy lại Uri từ ý định:

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

1
Cảnh báo: Câu trả lời / giải pháp ở trên không nên được sử dụng cho các chương trình phát sóng địa phương vì bạn có thể thấy chúng sẽ không được nhận. Đối với các chương trình phát sóng cục bộ, tốt hơn nên sử dụng câu trả lời của 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();


Và sau đó bạn có thể tìm nạp nó như thế này:

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

1

đây là cách tôi sử dụng nó; Nút này bên trong lớp Hoạt động CameraActionActivity mà tôi gọi là camera

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

Và Lớp hoạt động DisplayVideo khác của tôi

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

Nếu bạn muốn sử dụng trường dữ liệu bổ sung tiêu chuẩn, bạn sẽ làm như sau:

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

Tài liệu cho Intent cho biết:

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"

Bạn không nhất thiết phải sử dụng các tên tiêu chuẩn có sẵn, nhưng có lẽ đây là phương pháp hay và có thể tái sử dụng nhiều hơn. Hãy xem tài liệu dành cho nhà phát triển để biết danh sách tất cả các trường dữ liệu bổ sung chuẩn được tích hợp sẵn.


0

Điều Uri.parse(extras.getString("imageUri"))này đã gây ra lỗi:

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 

Vì vậy, tôi đã thay đổi như sau:

intent.putExtra("imageUri", imageUri)

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

Điều này đã giải quyết vấn đề.


-2

bạn có thể làm như thế này. imageuri có thể được chuyển đổi thành chuỗi như thế này.

ý định.putExtra ("imageUri", imageUri.toString ());

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.