0

私はAndroid用の独自の音楽プレーヤーを開発しています(Androidでプログラミングすることを学んでいます)。

私の質問は、アプリケーションが初めて起動したときに、ファイルをスキャンするメディア フォルダーを選択するようユーザーに要求することです。すべてうまく機能しますが、フォルダーには約 1200 曲あり、スキャンが完了するまでに約 3 分かかります。スキャンに含まれる手順は、フォルダーからファイルを再帰的に取得し、すべての曲の完全なパスを arraylist に追加します。次に、arraylist のすべての項目をデータベースに追加します。データベースに追加するフィールドは、パス、曲のタイトル (MediaMetadataReader を使用してこれを取得します)、アーティスト、アルバム、および一意の ID です。

これを行うより良い方法はありますか?これを最適化する方法はありますか?前もって感謝します。

編集:

他の音楽プレーヤーを初めて実行すると、それらのライブラリにはメタデータと共に私が持っているすべての曲が含まれています。スキャンにかかる時間はほんの数秒です。彼らはどうやってそれをするのですか?私は何を間違っていますか?

4

2 に答える 2

3

アプリケーションに初めてメディアフォルダが割り当てられたときはどうでしょうか。すべてのファイルを同じように繰り返し、パスのみを取得します。

File dir = new File(dirPath);
File[] filelist = dir.listFiles();

次に、アプリケーションに関連付けられた一意の名前またはIDを使用して同じフォルダーにXMLファイルを作成します。

<Songs>
  <song>
   <name></name>
   <thumbnailpath></thumbnailpath>
   <filepath></filepth>
  </song>
</Songs>

そして、次にユーザーがフォルダを選択したときに、リストされたxmlファイルを作成したかどうかを確認しますか?そうでない場合は、作成し、将来的にはこれをテーブルのソースとしてxmlファイルに使用します。

ただし、トリックの部分は、ユーザーがメディアを変更したときに、メディアが新しく追加されたと言って、それを処理するロジックを作成する必要があることです。

OPのコメント後

ええと、私は何も持っていませんが、グーグルはいつもそこにいます笑。しかし、私があなたに言うことを覚えているもう一つのことはです。ユーザーにプレイリストを作成させる方が賢明です。1200曲を一緒に読むのは好きではありませんが、リストをいくつかの異なるプレイリストに切り刻むことで、アルゴリズムが少数のファイルでより速くトラバースできるようになります:)

于 2012-04-29T02:36:00.030 に答える
1

Craftero の答えは正しいですが、XML ファイルを使用してファイル システムのコンテンツをシリアル化する代わりに、SQLite データベースを使用してディレクトリのコンテンツをキャッシュすることをお勧めします。これは十分に柔軟なソリューションであり、バックグラウンド サービスをスケジュールしてデータベースを定期的に更新し、新しい曲を探すことができます (または、アプリケーションを開いたときに新しいスキャンを手動で開始します)。これにより、両方の長所を活用できます。最初に、これまでに見つけたすべてのものをすばやく表示し (アプリの初回実行時を除く)、後でデータベース (および対応するビュー) を新しいもので更新できます。見つけたファイル。おそらく、Android 配列に 1200 曲を保持することは望ましくないことに注意してください。これは、アプリにとってかなりの量のメモリのように思われます。

于 2012-04-29T02:59:49.297 に答える