URIをインテントに渡す方法は?


98

別のアクティビティでそのURIを使用するために、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 ...

君たちありがとう



回答:


178

URIを文字列として保存できます

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

そして、このように文字列をuriに戻すだけです

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

2
わかりました。しかし、URIを文字列として保存する方法がわかりません:(
Robert El

上記のコードでは、文字列に変換されています。imageuri.toString()は、uriを文字列に変換しています。
Rufflez 2015

1
@malclockeの方が優れたソリューションです。手動で文字列に変換して戻す必要はありません。
クロックスミス2016年

intent.setData(imageUri);を使用できます。
Buntupana 2017年

1
しばらくの間、私は「エクストラ」が何を意味するのかと思っていました。簡単に言えば: intent.putExtra("imageUrl", mImageUri.toString()); 他のアクティビティ String imageUrl = getIntent().getStringExtra("imageUrl"); Uri mImageUri = Uri.parse(imageUrl);
ブライアン

135

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
今後の参考のintent.putExtras(bundle);ためbundle.putParcelable("imageUri", uri);に、を使用する前にBundleオブジェクトにいくつかのエクストラを追加する場合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

52

インテントでは、直接ウリを置くことができます。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");

これで問題は解決しました。


-2

このようにすることができます。imageuriはこのように文字列に変換できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.