くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

# Android の DCIM 上にある画像ファイルを ImageView に表示する

環境

  • Android 5.0 Zenfone 2
  • Android Studio 2.3

やったこと

MainActivity.java

// Import とかは省略

public class MainActivity extends AppCompatActivity {

    public android.widget.ImageView ImageView;
    public Button Button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView = (android.widget.ImageView)findViewById(R.id.imageView);
        Button2 = (Button) findViewById(R.id.button2);
        Button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // DCIM へのパスを取得
                File dir = new File(Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM );
                // DCIM 上の画像ファイルへのパスを設定
                File file = new File(dir.getAbsolutePath()+"/image.jpeg");
                // 正しい画像へのパスが取れているか確認のためにログ出力
                Log.d("画像を表示させるやつ",file.getPath());
                // 画像ファイルが存在してないときは Image View に表示させないようにしている
                if (file.exists()) {
                    // 画像が存在していたら ImageView に表示させる
                    ImageView.setImageBitmap(BitmapFactory.decodeFile(file.getPath()));
                }else{
                    // 画像ファイルを見つけれなかったら、調査のためにログ出力
                    Log.d("StorageAccessTest","File not found.");
                }
            }
        });

    }
}

AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

実行結果

はまったこと

画像ファイルがあるはずなのに、 画像ファイルを見つけることができずに file.exists() が False を返していました。

原因を探ってみると、 Permission へ記述しなければいけないようでした。