基本的な画像の印刷

ここでは 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 を指定しているので印刷となりましたが、他のアプリ、 例えば画像エディタなどを選択すれば(そのアプリが適切に処理する限り)そのエディタに選んだファイルが開かれるはずです。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門