ギャラリーからインテントで画像を受け取って表示するテスト(その2)


2014年4月27日現在、私が理解している内容です。
間違っている場合があります。


外部のファイラーで画像を選択したとき、
画像を表示するアプリのリストに自分を加えて、表示させたい




外部のファイラーで、任意の画像を選択する。

 


選択した画像を、どのアプリで表示するかリストが出るので、
その中に自分のアプリ「test29」を加えて選択できるようにする。



選択されたら、画像を受け取り、表示する。



画像の表示の仕方は、ウィンドウサイズに合わせるとか、拡大するとか縮小するとか、適当に作りましょう。


ギャラリーからインテントで画像を受け取って表示するテスト」のコードを修正。

暗黙的インテントで呼び出されるために、マニフェストファイルの設定が必要です。

暗黙的インテントが送信された時、自分(コンポーネント)は、そのインテントを受け取れるか、
androidに知らせるために、AndroidManifest.xmlで、インテントフィルタを定義しておきます。

インテントフィルタによって、
「アクション要素」「カテゴリ要素」「データ要素」というチェックが入り、
コンポーネントがインテントを受け取れるかどうか、androidに判断されます。




AndroidManifest.xmlの確認

暗黙的インテントから、どんなデータを受け取るか、その内容を定義するために、
「intent-filter」として、「action」「category」「data」を設定します。
「*.jpg」データなど、画像データを受け取って表示する場合は、以下のような記述になります。


<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/jpg"/> </intent-filter>


このとき、初めにあった次の記述を削除すると、アプリをインストールしても、一覧に表示されません。
画像を選択すると、画像を表示するアプリ一覧の中に出てきます。

<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test29" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.test29.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/png" /> </intent-filter> </activity> </application> </manifest>






暗黙的インテントから画像データを受け取る


「MainActivity」の、「onCreate」の中で、次の記述をします。

「getIntent()」「getData()」で「uri」が取得できます。
「Media.getBitmap(getContentResolver(), uri)」で、Bitmapにロードできます。
このとき、画像データなら「import android.provider.MediaStore.Images.Media」をインポートしておきます。
「view1」は、画像が表示されるImageViewです。

Intent intent = getIntent(); Uri uri = intent.getData(); if (uri != null) { try { Bitmap bmp = Media.getBitmap(getContentResolver(), uri); if (bmp != null) view1.setImageBitmap(bmp); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }


「uri.toString()」で、次の、URIスキームが取得できます。

file:///mnt/sdcard/test02.jpg


「uri.getPath()」で、ファイルパスが取得できます。

/mnt/sdcard/test02.jpg


「uri.getScheme()」で、スキームの種類が取得できます。

file


ほかに、「uri.getHost()」「uri.getPort()」で、ホスト、ポートが取得できます。


MainActivity.java

package com.example.test29; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore.Images.Media; //画像データならこれをインポートする import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; public class MainActivity extends Activity { static final int MY_INTENT_GALLERY = 1; ImageView view1; LinearLayout layout1; Button button1; int GalleryFlg1=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //タイトルバー非表示 //requestWindowFeature(Window.FEATURE_NO_TITLE); //レイアウトを作ってボタンを並べる layout1 = new LinearLayout(this); layout1.setOrientation(LinearLayout.VERTICAL); //縦に並べる setContentView(layout1); //---------------------- //ボタン button1 = new Button(this); button1.setText("GALLERY"); layout1.addView(button1); //----------------------- //表示用ビュー view1 = new ImageView(this); view1.setBackgroundColor(Color.argb(255, 255, 0, 0)); view1.setImageResource(R.drawable.ic_launcher); //view1.setScaleType(ImageView.ScaleType.FIT_XY); //縦横をビューに合わせる LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(240,400); //この大きさで表示 view1.setLayoutParams(params1); //ビューにパラメータをセット layout1.addView(view1); //----------------------- button1.setOnClickListener( new OnClickListener(){ @Override public void onClick(View v) { //ギャラリー Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent,MY_INTENT_GALLERY ); } }); //----------------------- //暗黙的インテントから画像を受け取る Intent intent = getIntent(); Uri uri = intent.getData(); if (uri != null) { try { Bitmap bmp = Media.getBitmap(getContentResolver(), uri); if (bmp != null) view1.setImageBitmap(bmp); Toast.makeText(this, "暗黙的インテントから起動した", Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else{ Toast.makeText(this, "通常起動", Toast.LENGTH_LONG).show(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ if(GalleryFlg1==1){ GalleryFlg1=0; //ビューを消す layout1.removeView(view1); //ステータスバー出す getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //ボタン出す layout1.addView(button1); //ビューサイズ動的変更 view1.setLayoutParams(new LinearLayout.LayoutParams(240, 400)); //ビュー出す layout1.addView(view1); } else{ //終わる finish(); } return true; } return false; } public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); //受け渡し結果の戻り値 if (requestCode == MY_INTENT_GALLERY) { if (resultCode == RESULT_OK) { //受け渡し成功 //Uri uri = intent.getData(); String pathname = intent.getData().getPath(); //String pathname = intent.getData().getLastPathSegment(); Toast.makeText(MainActivity.this , pathname,Toast.LENGTH_LONG).show(); PutImage1(intent); } else if (resultCode == RESULT_CANCELED) { //キャンセルされた Toast.makeText(MainActivity.this , "CANCEL",Toast.LENGTH_LONG).show(); } } } public void PutImage1(Intent intent){ try { //画像表示 InputStream stream = getContentResolver().openInputStream(intent.getData()); Bitmap bmp = BitmapFactory.decodeStream(stream); stream.close(); //サイズ取得 int width = bmp.getWidth(); int height = bmp.getHeight(); //ビューサイズ動的変更 view1.setLayoutParams(new LinearLayout.LayoutParams(width, height)); view1.setImageBitmap(bmp); //全画面表示 GalleryFlg1=1; //ステータスバー消す getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //タイトルバー消す//ここで消すとエラー? //requestWindowFeature(Window.FEATURE_NO_TITLE); //ボタン消す layout1.removeView(button1); } catch (Exception e) { } } }

端末の画面を回転させると、初期状態に戻りますので、適当に対応しましょう。















戻る