1

Nexus7タブレット用の音楽プレーヤーアプリを作成しようとしています。特定のディレクトリから音楽ファイルを取得したり、タイトルやアーティストなどの関連情報を取得したりできます。ファイルのタイトルをクリック可能なリストビューにロードしました。ユーザーがタイトルをクリックすると、関連する曲を再生するアクティビティに移動します。タイトルをアルファベット順に並べ替えようとしていたところ、問題が発生しました。タイトルだけを並べ替えると、正しい曲と一致しなくなります。私はタイトルだけを注文し、実際のファイルは注文しなかったので、これは予想されることです。これを実行して、並べ替えアルゴリズムを変更しようとしました。

//will probably only work for Nexus 7
private final static File fileList = new File("/storage/emulated/0/Music/");
private final static File fileNames[] = fileList.listFiles(); //get list of files

public static void sortFiles()
{
    int j;
    boolean flag = true;
    File temp;

    MediaMetadataRetriever titleMMR = new MediaMetadataRetriever();
    MediaMetadataRetriever titleMMR2 = new MediaMetadataRetriever();

     while(flag)
     {
         flag = false;

         for(j = 0; j < fileNames.length - 1; j++)
         {
             titleMMR.setDataSource(fileNames[j].toString());
             titleMMR2.setDataSource(fileNames[j+1].toString());

             if(titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE).compareToIgnoreCase(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)) > 0)
             {
                 temp = fileNames[j];
                 fileNames[j] = fileNames[j+1];     // swapping
                 fileNames[j+1] = temp;
                 flag = true;
             }//end if 
         }//end for
     }//end while
}

これは、2つのファイルから曲のタイトルを取得して比較し、最初のファイルが2番目のファイルの後にアルファベット順に続く場合は、ファイル配列内のファイルを交換することになっています。何らかの理由で、このメソッドを呼び出すアクティビティを実行すると、アプリがクラッシュします。titleMMR2のデータソース から+1を削除した場合titleMMR2.setDataSource(fileNames[j].toString());

アプリがクラッシュすることはなくなりましたが、リストは正常ではありません。繰り返しますが、これは曲のタイトルを自分自身と比較するので理解できます。+1でプログラムがクラッシュする理由がわかりません。範囲外の配列エラーではありません。ディレクトリには合計6つの.mp3ファイルがあり、それらはそのディレクトリ内の唯一のファイルです。私も使ってみArrays.sort(fileNames)ましたが、曲名ではなくファイル名で注文するだけです。私もこれを試しました:

Arrays.sort(fileNames, new Comparator<File>(){
        public int compare(File f1, File f2)
        {
            titleMMR.setDataSource(f1.toString());
            titleMMR2.setDataSource(f2.toString());

            return titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE).compareToIgnoreCase(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
        } });

そのスニペットもクラッシュしました。Javaコードにエラーはなく、適切なクラスがすべてインポートされています。私は何が悪いのか本当に途方に暮れています。どんな助けでもありがたいです、そして、何か新しい情報が必要であるならば、私は喜んでそれを提供します。前もって感謝します。

修繕

正しいコードスニップは次のとおりです。

public static void sortFiles()
{
    int j;
    boolean flag = true;
    File temp;

    MediaMetadataRetriever titleMMR = new MediaMetadataRetriever();
    MediaMetadataRetriever titleMMR2 = new MediaMetadataRetriever();

     while(flag)
     {
         flag = false;

         for(j = 0; j < fileNames.length - 1; j++)
         {
             titleMMR.setDataSource(fileNames[j].toString());
             titleMMR2.setDataSource(fileNames[j+1].toString());

             String title1;
             String title2;

             if(titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null)
                 title1 = fileNames[j].getName();
             else
                 title1 = titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);

             if(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null)
                 title2 = fileNames[j+1].getName();
             else
                 title2= titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);

             if(title1.compareToIgnoreCase(title2) > 0)
             {
                 temp = fileNames[j];
                 fileNames[j] = fileNames[j+1];     // swapping
                 fileNames[j+1] = temp;
                 flag = true;
             }//end if 
         }//end for
     }//end while
}
4

0 に答える 0