Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidアプリで内部ストレージの画像ファイルを読み込む方法【サンプルコード付き】

このチュートリアルでは、Androidアプリで内部ストレージ(Internal Storage)に保存された画像ファイルを読み込み、ImageViewに表示する方法を、実際のサンプルコードとともにわかりやすく解説します。

作成するアプリの概要

今回作成するのは、非常にシンプルなデモアプリです。画面には「read」ボタンとImageViewが1つずつ配置されており、ボタンをタップすると内部ストレージの専用ディレクトリからPNG画像を読み取り、ImageViewに表示します。

ステップ1:Android Studioで新規プロジェクトを作成する

Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを記述します。

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    xmlns:tools = "https://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity"
    android:orientation = "vertical">
    <Button
        android:id = "@+id/read"
        android:text = "read"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content" />
    <ImageView
        android:id = "@+id/imageView"
        android:layout_width = "300dp"
        android:layout_height = "300dp" />
</LinearLayout>

このレイアウトでは、ボタンとImageViewを垂直方向(vertical)に並べています。ボタンがタップされると、内部ストレージから画像を取得してImageViewに表示する仕組みです。

ステップ3:MainActivity.java を実装する

src/MainActivity.java に以下のコードを記述します。

package com.example.andy.myapplication;

import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends AppCompatActivity {
    Button read;
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView);
        read = findViewById(R.id.read);
        read.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContextWrapper cw = new ContextWrapper(getApplicationContext());
                File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
                File file = new File(directory, "mario" + ".png");
                imageView.setImageDrawable(Drawable.createFromPath(file.toString()));
            }
        });
    }
}

補足:AndroidXを採用した新しいプロジェクトでは、android.support.v7.app.AppCompatActivity の代わりに androidx.appcompat.app.AppCompatActivity をインポートしてください。

コードのポイント解説

画像読み込みの中核となるのは、ボタンのクリックリスナー内にある以下の処理です。

  • ContextWrapper#getDir():アプリ専用の内部ストレージディレクトリ(ここでは「imageDir」)へのパスを取得します。第2引数に Context.MODE_PRIVATE を指定することで、他アプリからアクセスできないプライベートなディレクトリとして扱われます。
  • Fileオブジェクトの生成:取得したディレクトリとファイル名「mario.png」を組み合わせて、読み込み対象のファイルパスを作成します。
  • Drawable#createFromPath():ファイルパスからDrawableオブジェクトを生成し、setImageDrawable() でImageViewにセットして画面に表示します。

なお、このコードは事前に同じディレクトリへ画像が保存されていることが前提です。保存処理を実装していない場合は、FileOutputStreamBitmap.compress() を使ってあらかじめ画像を書き込んでおきましょう。

アプリを実行して動作を確認する

それでは、実際にアプリを起動してみましょう。Android端末をPCに接続している状態を前提に説明します。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。接続した実機を選択すると、端末に次のような初期画面が表示されます。

Androidアプリで内部ストレージの画像ファイルを読み込む方法【サンプルコード付き】

この画面で「read」ボタンをタップすると、内部ストレージから画像が読み込まれ、以下のようにImageViewに表示されます。

Androidアプリで内部ストレージの画像ファイルを読み込む方法【サンプルコード付き】

まとめ

本記事では、ContextWrapperのgetDir()メソッドで内部ストレージのプライベートディレクトリにアクセスし、Drawable.createFromPath()で画像ファイルを読み込んでImageViewに表示する方法を紹介しました。内部ストレージは他アプリから参照できないため、ユーザーデータやキャッシュ画像の管理に適しています。ぜひ自身のプロジェクトでも活用してみてください。

  1. Androidスマホの内部ストレージを解放する方法|空き容量不足を解消する4つのテクニック

    近年の技術革新に伴い、Androidスマートフォンは世界中でますます人気が高まっています。画面をタッチするだけであらゆる作業がこなせるため、多くの人が従来のフィーチャーフォンではなくスマートフォンを選ぶようになりました。Androidは定期的にバージョンアップを行い、システム強化によって既存ユーザーにも新規ユーザーにもより良い体験を提供し続けています。しかし、こうした進化には代償が伴います。OSが更新され、アプリがより快適に動作し、ゲームがよりリアルになる一方で、スマホのストレージ容量はどんどん圧迫されていくのです。「内部ストレージの空き容量が不足しています」という警告が表示された経験がある方

  2. Androidストレージ入門:内部ストレージと外部ストレージの違いと使い分け

    ストレージは誰もが知っている存在でありながら、ついその重要性を見過ごしてしまいがちなものです。かつてはストレージ容量のわずかな増加さえも大きな飛躍であり、実現不可能に思えることさえありました。しかし今では、デバイスにどれだけの容量があるかを気にする人はほとんどいません(その違いに関心を持つ人はさらに少ないでしょう)。 より重要なのは、ストレージに保存されるデータの変遷に目を向けることです。スマートフォン以前の時代、私たちが保存していたのはたまに撮影した写真数枚、いくつかのゲーム、そして大量のテキストメッセージ程度でした。しかし現在、標準的なスマートフォンには、アプリケーション、ドキュメント、写