एक इरादे के लिए URI कैसे पास करें?


99

मैं उस उद्देश्य के लिए एक अन्य गतिविधि में उपयोग करने के लिए अपने इरादे के लिए एक यूआरआई-ऑब्जेक्ट पास करने की कोशिश कर रहा हूं ...

मैं एक यूआरआई कैसे पास करूं?

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

आप स्ट्रिंग के रूप में यूरी स्टोर कर सकते हैं

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

और फिर स्ट्रिंग को वापस इस तरह से uri में बदलें

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

2
ओके कूल ... लेकिन मुझे नहीं पता कि स्ट्रिंग के रूप में एक यूरी को कैसे स्टोर किया जाता है :(
रॉबर्ट एल

ऊपर दिए गए कोड में, इसे एक स्ट्रिंग में बदल दिया गया है। imageuri.toString () आपके लिए uri को स्ट्रिंग में परिवर्तित कर रहा है।
रफ़लज़

1
@malclocke का बेहतर समाधान है। मैन्युअल रूप से स्ट्रिंग और बैक में कनवर्ट करने की आवश्यकता नहीं है।
चौकीदार

आप आशय का उपयोग कर सकते हैं ।setData (imageUri);
बंटुपाना

1
एक पल के लिए मैं सोच रहा था कि "एक्स्ट्रा" का क्या मतलब है। सरल शब्दों में: intent.putExtra("imageUrl", mImageUri.toString()); अन्य गतिविधि में String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
ब्रायन

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!
कालेब जेरेस

4
भविष्य के संदर्भ के लिए, यदि आप intent.putExtras(bundle);उपयोग bundle.putParcelable("imageUri", uri);करने से पहले एक बंडल ऑब्जेक्ट में कई एक्स्ट्रा डाल रहे हैं, तो intent.putExtra(...);सीधे Intentऑब्जेक्ट में उपयोग करने के बजाय उपयोग करें ।
आर्मंडो

Arrays भी काम करता है! 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
उमर बोशरा

52

इरादे में, आप सीधे उरी डाल सकते हैं। आपको उड़ी को स्ट्रिंग में बदलने और वापस उरी में फिर से बदलने की आवश्यकता नहीं है।

इस सरल दृष्टिकोण को देखें।

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

और उरी को इरादे से वापस पाने के लिए:

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

1
चेतावनी: स्थानीय प्रसारण के लिए उपरोक्त उत्तर / समाधान का उपयोग नहीं किया जाना चाहिए क्योंकि आप पा सकते हैं कि उन्हें प्राप्त नहीं होगा। स्थानीय प्रसारणों के लिए, mallocklocke के उत्तर का उपयोग करना बेहतर है: stackoverflow.com/a/13981436/1617737
प्रतिबंध-जियोइंजीनियरिंग

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

इरादे के लिए दस्तावेज कहते हैं:

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

आप ऐसा कर सकते हैं। इमेजरी को इस तरह से स्ट्रिंग में बदला जा सकता है।

आशय.पुट.इक्स्ट्रा ("इमेजयूरी", इमेजयूरी.टोस्ट्रिंग ());

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.