質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

312閲覧

内部ストレージの音楽フォルダに入っている音楽をリスト化したいが、ファイルが存在するのにパスがNULLになってしまう問題

Pirsoyn

総合スコア0

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/10/03 08:17

内部ストレージの音楽フォルダに入っている音楽をリスト化したいです

android studio JAVA で内部ストレージの音楽フォルダに入っている音楽をリスト化したいですが、ファイルが存在するのにパスがNULLになってしまいます。

実現したいこと

  • Musicフォルダに入っている音楽をlistviewで表示

発生している問題・エラーメッセージ

File fileDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
String strPath = fileDir.getPath();
File[] filePaths = new File(strPath).listFiles();
if (filePaths != null) {  ここでfirePaths = null
for (File file : filePaths) {

該当のソースコード

android

1 2package com.example.musiclisttest; 3 4import static android.content.ContentValues.TAG; 5 6import androidx.appcompat.app.AppCompatActivity; 7import androidx.core.content.ContextCompat; 8 9import android.Manifest; 10import android.content.pm.PackageManager; 11import android.media.MediaMetadataRetriever; 12import android.os.Build; 13import android.os.Bundle; 14import android.os.Environment; 15import android.util.Log; 16import android.view.View; 17import android.widget.AdapterView; 18import android.widget.ArrayAdapter; 19import android.widget.ListView; 20import android.widget.Toast; 21 22import java.io.File; 23import java.util.ArrayList; 24import java.util.List; 25import java.util.Locale; 26 27 28public class MainActivity extends AppCompatActivity implements View.OnClickListener { 29 List<String> arMediaPath; 30 private ListView listView; 31 private MyListAdapter adapter; 32 String x,y,z; 33 ArrayList<Mydata> mItem = new ArrayList<Mydata>(); 34 public void getMediaMetadataInfo() { 35 36 // 外部メディアのパスを取得 37 // getExternalStoragePublicDirectory deprecated in Android Q 38 File fileDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); 39 40 String strPath = fileDir.getPath(); 41 // String strPath = "/storage/emulated/0/Music"; 42 File[] filePaths = new File(strPath).listFiles(); 43 //File[] filePaths = new File("/storage/emulated/0/Music").listFiles(); 44 if (filePaths != null) { 45 for (File file : filePaths) { 46 if (file.isFile()) { 47 // ファイルパスを保存 48 arMediaPath.add(strPath + "/" + file.getName()); 49 } 50 51 } 52 } 53 54 // メタ情報を取得するためのクラス 55 MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 56 57 for (int i = 0; i < arMediaPath.size(); i++) { 58 Log.v(TAG, "ファイルパス:" + arMediaPath.get(i)); 59 // ファイルパスをセット 60 mmr.setDataSource(arMediaPath.get(i)); 61 62 // メタ情報を取得 63 Log.v(TAG, "アルバム名:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM)); 64 Log.v(TAG, "アーティスト名:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)); 65 Log.v(TAG, "ビットレート(bits/sec):" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)); 66 Log.v(TAG, "作曲者:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER)); 67 Log.v(TAG, "再生時間(ms):" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); 68 Log.v(TAG, "ジャンル:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)); 69 Log.v(TAG, "MIMEタイプ:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)); 70 Log.v(TAG, "タイトル:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)); 71 Log.v(TAG, "作成された年:" + mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR)); 72 73 /* アートワーク 74 byte[] data = mmr.getEmbeddedPicture(); 75 if (data != null) { 76 // ImageViewでアートワークを表示 77// ImageView imageView = findViewById(R.id.imageView); 78// imageView.setImageBitmap(BitmapFactory.decodeByteArray(data, 0, data.length)); 79*/ 80 81 82 x = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 83 y = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); 84 //アルバム名をリストへ入れる アーティスト名をリストへ入れる 85 mItem.add(new Mydata (x,y)); 86 87 } 88 } 89 90 91 92 93 94 @Override 95 protected void onCreate(Bundle savedInstanceState) { 96 super.onCreate(savedInstanceState); 97 setContentView(R.layout.activity_main); 98 arMediaPath = new ArrayList<String>(); 99 100 101 listView = (ListView) findViewById(R.id.listview); 102 103 getMediaMetadataInfo(); 104 105 adapter = new MyListAdapter(this.getApplicationContext(), mItem); 106 listView.setAdapter(adapter); 107 108 //匿名クラス 109 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 110 //クリック時 111 @Override 112 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 113 //選択されたアイテムの取得 114 Mydata item = (Mydata) parent.getItemAtPosition(position); 115 Toast.makeText(getApplicationContext(), item.getName(), Toast.LENGTH_LONG).show(); 116 } 117 }); 118 } 119 120 public void onClick(View v){ 121 122 } 123 124 125 private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 100; 126 127 private void checkPermission() { 128 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 129 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 130 // Build.VERSION_CODES.M 以降でパーミッション許可済 131 // put your code for Version>=Marshmallow 132 getMediaMetadataInfo(); 133 134 } else { 135 // 許可されていない時の処理 136 if (shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)) { 137 // ユーザーがPermissionを明示的に拒否された時 Permissionが必要な理由を表示して再度許可を求めたり、機能を無効にしたりする 138 Toast.makeText(this, "App required access to external storage", Toast.LENGTH_SHORT).show(); 139 } else { 140 // まだ許可を求める前の時、許可を求めるダイアログを表示 141 142 } 143 requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 144 } 145 146 } else { 147 // put your code for Version < Marshmallow 148 getMediaMetadataInfo(); 149 } 150 151 } 152 153 @Override 154 public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 155 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 156 switch (requestCode) { 157 case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { 158 // If request is cancelled, the result arrays are empty. 159 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 160 // 許可された場合の処理 161 162 // permission was granted, yay! Do the 163 // contacts-related task you need to do. 164 165 getMediaMetadataInfo(); 166 167 } else { 168 // 拒否された場合の処理 169 170 // permission denied, boo! Disable the 171 // functionality that depends on this permission. 172 } 173 return; 174 } 175 176 // other 'case' lines to check for other 177 // permissions this app might request 178 } 179 } 180} 181 182

試したこと

新しいファイルの作成、ファイルパスの手入力

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問