2012-02-13 11 views
2

mediastoreで表示されるSDカードからファイルを削除する際に2つの問題があります。ファイルとMediaStore-Entryの削除

mediastoreクエリ の結果と選択されたアイテムを削除するはずのボトム4ボタンのリストビューがあります。

これまでのところ、ファイル自体の削除は正常に動作します。それでも、プログラムを再起動しても、リストは更新されません。 ではありません。 です。 以下のコード全体を追加しました。

//new stuff is for the deleting function 

import java.io.File; 
import java.io.IOException; 
import java.math.BigDecimal; 
import android.app.ListActivity; 
import android.content.Context; 
import android.database.Cursor; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.SeekBar; 
import android.widget.SimpleCursorAdapter; 
import android.widget.TextView; 

public class MusicListActivity extends ListActivity { 
    private static final int UPDATE_FREQUENCY = 500; 
    private static final int STEP_VALUE = 10000; 

    private MediaCursorAdapter mediaAdapter = null; 
    private TextView selelctedFile = null; 
    private SeekBar seekbar = null; 
    private MediaPlayer player = null; 
    private ImageButton playButton = null; 
    private ImageButton prevButton = null; 
    private ImageButton nextButton = null; 
    private ImageButton deleteButton = null; 

    private boolean isStarted = true; 
    private String currentFile = ""; 
    private boolean isMoveingSeekBar = false; 

    private final Handler handler = new Handler(); 

    private final Runnable updatePositionRunnable = new Runnable() { 
     public void run() { 
      updatePosition(); 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     selelctedFile = (TextView)findViewById(R.id.selectedfile); 
     seekbar = (SeekBar)findViewById(R.id.seekbar); 
     playButton = (ImageButton)findViewById(R.id.play); 
     prevButton = (ImageButton)findViewById(R.id.prev); 
     nextButton = (ImageButton)findViewById(R.id.next); 
     //new stuff 
     deleteButton = (ImageButton)findViewById(R.id.delete); 

     player = new MediaPlayer(); 

     player.setOnCompletionListener(onCompletion); 
     player.setOnErrorListener(onError); 
     seekbar.setOnSeekBarChangeListener(seekBarChanged); 


     Cursor cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      null, 
      MediaStore.Audio.Media.DATA + " like ? ", 
      new String[] {"%Beruhigungssounds%"}, 
      null); 


     if(null != cursor) 
     { 
      cursor.moveToFirst(); 

      mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor); 

      setListAdapter(mediaAdapter); 

      playButton.setOnClickListener(onButtonClick); 
      nextButton.setOnClickListener(onButtonClick); 
      prevButton.setOnClickListener(onButtonClick); 
      //new stuff here 
      deleteButton.setOnClickListener(onButtonClick); 
     } 
    } 

    @Override 
    protected void onListItemClick(ListView list, View view, int position, long id) { 
     super.onListItemClick(list, view, position, id); 

     currentFile = (String) view.getTag(); 

     startPlay(currentFile); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     handler.removeCallbacks(updatePositionRunnable); 
     player.stop(); 
     player.reset(); 
     player.release(); 

     player = null; 
    } 

    private void startPlay(String file) { 
     Log.i("Selected: ", file); 

     selelctedFile.setText(file); 
     seekbar.setProgress(0); 

     player.stop(); 
     player.reset(); 

     try { 
      player.setDataSource(file); 
      player.prepare(); 
      player.start(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     seekbar.setMax(player.getDuration()); 
     playButton.setImageResource(android.R.drawable.ic_media_pause); 

     updatePosition(); 

     isStarted = true; 
    } 

    private void stopPlay() { 
     player.stop(); 
     player.reset(); 
     playButton.setImageResource(android.R.drawable.ic_media_play); 
     handler.removeCallbacks(updatePositionRunnable); 
     seekbar.setProgress(0); 

     isStarted = false; 
    } 

    //new stuff here 
    private void delete(String file) { 
     Log.i("Selected: ", file); 
     selelctedFile.setText(file); 
     player.stop(); 
     player.reset(); 
     playButton.setImageResource(android.R.drawable.ic_media_play); 
     handler.removeCallbacks(updatePositionRunnable); 
     seekbar.setProgress(0); 
     isStarted = false; 
     File datei = new File(file); 
     datei.delete(); 
     selelctedFile = null; 
    } 
    //new stuff here 

    private void updatePosition(){ 
     handler.removeCallbacks(updatePositionRunnable); 

     seekbar.setProgress(player.getCurrentPosition()); 

     handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY); 
    } 

    private class MediaCursorAdapter extends SimpleCursorAdapter{ 

     public MediaCursorAdapter(Context context, int layout, Cursor c) { 
      super(context, layout, c, 
        new String[] { MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION}, 
        new int[] { R.id.displayname, R.id.title, R.id.duration }); 
     } 

     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
      TextView title = (TextView)view.findViewById(R.id.title); 
      TextView name = (TextView)view.findViewById(R.id.displayname); 
      TextView duration = (TextView)view.findViewById(R.id.duration); 

      name.setText(cursor.getString(
        cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME))); 

      title.setText(cursor.getString(
        cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))); 

      long durationInMs = Long.parseLong(cursor.getString(
        cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION))); 

      double durationInMin = ((double)durationInMs/1000.0)/60.0; 

      durationInMin = new BigDecimal(Double.toString(durationInMin)).setScale(2, BigDecimal.ROUND_UP).doubleValue(); 

      duration.setText("" + durationInMin); 

      view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA))); 
     } 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      LayoutInflater inflater = LayoutInflater.from(context); 
      View v = inflater.inflate(R.layout.listitem, parent, false); 

      bindView(v, context, cursor); 

      return v; 
     } 
    } 

    private View.OnClickListener onButtonClick = new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      switch(v.getId()) 
      { 
       case R.id.play: 
       { 
        if(player.isPlaying()) 
        { 
         handler.removeCallbacks(updatePositionRunnable); 
         player.pause(); 
         playButton.setImageResource(android.R.drawable.ic_media_play); 
        } 
        else 
        { 
         if(isStarted) 
         { 
          player.start(); 
          playButton.setImageResource(android.R.drawable.ic_media_pause); 

          updatePosition(); 
         } 
         else 
         { 
          startPlay(currentFile); 
         } 
        } 

        break; 
       } 
       case R.id.next: 
       { 
        int seekto = player.getCurrentPosition() + STEP_VALUE; 

        if(seekto > player.getDuration()) 
         seekto = player.getDuration(); 

        player.pause(); 
        player.seekTo(seekto); 
        player.start(); 

        break; 
       } 
       case R.id.prev: 
       { 
        int seekto = player.getCurrentPosition() - STEP_VALUE; 

        if(seekto < 0) 
         seekto = 0; 

        player.pause(); 
        player.seekTo(seekto); 
        player.start(); 

        break; 
       } 
       //new stuff here 
       case R.id.delete: 
       { 
        delete(currentFile); 
        break; 
       } 
       //new stuff here 
      } 
     } 
    }; 

    private MediaPlayer.OnCompletionListener onCompletion = new MediaPlayer.OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      stopPlay(); 
     } 
    }; 

    private MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() { 

     @Override 
     public boolean onError(MediaPlayer mp, int what, int extra) { 
      // returning false will call the OnCompletionListener 
      return false; 
     } 
    }; 

    private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      isMoveingSeekBar = false; 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      isMoveingSeekBar = true; 
     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { 
      if(isMoveingSeekBar) 
      { 
       player.seekTo(progress); 

       Log.i("OnSeekBarChangeListener","onProgressChanged"); 
      } 
     } 
    }; 
} 
+0

私は、URLからの曲の名前をロードする方法を探していますことを、あなたのような何かを行っている除いてほとんど同じコードを使用していますこの?私はここに私の質問を掲載しています... http://stackoverflow.com/questions/9355617/android-mediaplayer-streaming-music –

答えて

0

ContentResolverデータベースを更新する必要があると思います。

ContentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, String where, String[] selectionArgs) 

試してみてください。ContentResolver
ここに参考:Google Groups

+0

こんにちはmichale私はこの質問に恩恵をかけた人です、このコードは動作します getActivity ).getContentResolver()。delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI \t \t \t \t "TITLE = '" + songdetails.get(index).song + "'"、null); \t \t が、問題がある、それは指定されたタイトルを持つすべてのファイルを削除します.... 私が代わりにタイトルのデータを試みたが、それは動作しませんでした... uが使用するものに任意の提案を与えることができますタイトルの代わりに? –

+0

試してみてください:getContentResolver()。delete(MediaStore.Audio.Media.EXTERNAL_CONTEN T_URI、MediaStore.Audio.Media._ID + "=" + songdetails.get(index).id ... –

+0

あなたの時間をありがとう、私はすでに答えを尋ねましたが、私はそれを働かせました... –

0
File file = new File(songdetails.get(index).Path); 
       boolean deleted = file.delete(); 

private void scanaddedFile(String path) { 
    try { 
     MediaScannerConnection.scanFile(context, new String[] { path }, 
       null, new MediaScannerConnection.OnScanCompletedListener() { 
        public void onScanCompleted(String path, Uri uri) { 
         Log.i("ExternalStorage", "Scanned " + path + ":"); 
         Log.i("ExternalStorage", "-> uri=" + uri); 
         context.getContentResolver() 
           .delete(uri, null, null); 
        } 
       }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

}