Edited at

kotlinでAndroid端末内の画像を含むフォルダを検知する

画像系のアプリを作ってる時に端末内の画像を含むフォルダを表示させたかったので作成


ストレージの許可

端末の設定からアプリのストレージ設定を弄らないと内部ストレージにアクセスできない?らしい

詳しくはhttps://direct.fujixerox.co.jp/ap1/sc/beat/ja/support/020211.html


内部ストレージのパスを渡す

内部ストレージのパスをImgFileconクラスのimgfileserchに渡す


MainActivity.kt

package com.example.myapplication

import android.os.Bundle
import android.support.design.widget.BottomNavigationView
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
import com.example.myapplication.R.attr.content
import android.content.Context
import android.os.Environment

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

/*内部ストレージのパス取得*/
val path = Environment.getExternalStorageDirectory().getPath()
val dir = File(path)

/*内部ストレージのパスを渡す*/
val imgserch=ImgFilecon()
imgserch.imgfileserch(dir.toString())
}
}



画像を含むフォルダを探す

渡されたパス内のディレクトを再帰的に探索してファイルを探す。見つけたファイルが画像の拡張子(.jpgなど)を持っていたらそのファイルのあるディレクトリのパスを出力

余計な画像が出てきてしまうためAndroidフォルダはリジェクト


ImgFilecon.kt

package com.example.myapplication

import android.os.Parcel
import android.os.Parcelable
import java.io.File

class ImgFilecon() {
/*画像の含まれるディレクトリを再帰的に探すメソッド*/
tailrec fun imgfileserch(passname: String): Unit {

var flag = false
val dir = File(passname)

if (dir.listFiles() != null) {
/*渡されたパスを探査*/
loop@ for (i in dir.listFiles()) {

/*ファイルの時の処理*/
if (i.isFile()) {
val ext = Extension()
/*画像ファイル判定*/
if (!flag) {
when (ext.extensionsplit(i.toString(), ".")) {
"jpeg", "JPEG", "jpg", "JPG", "png", "PNG", "gif", "GIF" -> {
println("画像の含まれるディレクトリのパス" + dir)
flag = true
}
else -> {}
}
}
}

/*ディレクトリの時の処理*/
else if (i.isDirectory) {
val extdir = Extension()
/*Androidディレクトリは余計な画像が含まれるので表示しない*/
when (extdir.extensionsplit(i.toString(), "0/")) {
"/Android" -> {
continue@loop
}
else -> {
/*再帰*/
imgfileserch(i.toString())
}
}
}

}
} else println("null")
}
}



画像ファイルを判断するために拡張子切り出し

パスと区切り文字を渡すと区切り文字より下の文字列を返すメソッド。今回はファイルパスと区切り文字"."を渡して拡張子を取得した。


Extension.kt

package com.example.myapplication

import android.os.Parcel
import android.os.Parcelable

class Extension {

/*区切り文字で分割するメソッド*/
fun extensionsplit(filename: String, splitps: String): String {

/*splitpsで指定した文字のindex*/
val point = filename.lastIndexOf(splitps)

if (point != -1) {
/*pointより下の部分を切り出す*/
/* 例 xxxx.jpg→jpg*/
return filename.substring(startIndex = point + 1)
}
else return null.toString()
}
}



デモ

スクリーンショット 2019-02-11 7.04.09.png

こんな感じで端末内の画像を含むフォルダ一覧がAndroidStudioのRunに表示される


参考

ストレージへのアクセス許可:https://direct.fujixerox.co.jp/ap1/sc/beat/ja/support/020211.html


終わりに

Github:https://github.com/tf0101/MyApplication4