基本的な画像の印刷
ここでは Google Cloud Print を利用して、ギャラリに保存された画像の印刷ができることを確認します。
といっても、実はアプリ間のデータ共有という意味では「データのシェア - 単純なテキストを他のアプリに送る」と全く一緒です。
要はギャラリから画像を選ぶ・・・選んだ画像ファイルを Intent.ACTION_SEND で他のアプリに送る・・・それだけです。
考え方としてはそれだけなので、ポイントは実装方法ということになります。
では、まずは出来上がりの様子から。
アプリの見栄えは当サイト内の記事「ギャラリーからファイルを選ぶ」と全く同じです。
ボタンを押すとギャラリが開き、ここで画像ファイルを選びます。
「ギャラリーからファイルを選ぶ」ではパスをトースト通知して終わりましたが、 ここではファイルを Cloud Print に送り印刷します。
ここからは Cloud Print の画面ですね。これは記事「Google Cloud Print を利用した印刷」でみましたね。
問題なくプリントジョブが Cloud Print に送られると、"Print job submitted" というメッセージが表示されました。
さて、この実装は次の通りです。ほぼ「ギャラリーからファイルを選ぶ」の内容と一緒です。
レイアウトは次の通り。res/layout/activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pick File from Gallery"
android:id="@+id/pickButton"/>
</RelativeLayout>
コードは次の通り。
package com.example.printtest1;
import java.io.File;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
implements OnClickListener {
Button pickButton;
int RESULT_PICK_FILENAME = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pickButton = (Button)findViewById(R.id.pickButton);
pickButton.setOnClickListener(this);
}
public void onClick(View v) {
switch(v.getId()){
case R.id.pickButton:
pickFilenameFromGallery();
break;
}
}
private void pickFilenameFromGallery() {
Intent i = new Intent(
Intent.ACTION_PICK,
Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_PICK_FILENAME);
}
@Override
protected void onActivityResult(
int requestCode,
int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_PICK_FILENAME
&& resultCode == RESULT_OK
&& null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { Media.DATA };
Cursor cursor = getContentResolver().query(
selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex
= cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/jpeg");
shareIntent.putExtra(Intent.EXTRA_STREAM,
Uri.fromFile(new File(picturePath)));
startActivity(shareIntent);
}
}
}
ポイントだけ抜き出すと、次の箇所ですね。
...
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/jpeg");
shareIntent.putExtra(Intent.EXTRA_STREAM,
Uri.fromFile(new File(picturePath)));
startActivity(shareIntent);
ギャラリから画像を選んだ後、すなわち、画像ファイルのパスが取得できてからがポイントです。
ACTION_SEND のインテントで MIME タイプを "image/jpeg" に設定し、Intent.EXTRA_STREAM に 画像データをセットします。これでデータを送られた先のアプリケーションがそれを受け取り、適切に処理してくれるわけです。
ここでは送信先のアプリとして Cloud Print を指定しているので印刷となりましたが、他のアプリ、 例えば画像エディタなどを選択すれば(そのアプリが適切に処理する限り)そのエディタに選んだファイルが開かれるはずです。