2012-02-13 5 views
2

mediastore를 통해 표시되는 SD 카드에서 파일을 삭제할 때 두 가지 문제가 있습니다.파일 및 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

이, 당신이 같은 짓을 이? 나는 여기에 내 질문을 게시했습니다 ... http://stackoverflow.com/questions/9355617/android-mediaplayer-streaming-music –

답변

0

ContentResolver 데이터베이스를 업데이트해야한다고 생각합니다.

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

시도 : ContentResolver
여기 참조 : 내가 URL에서 노래 이름을로드 할 수있는 방법을 찾고 있어요 것을 제외하고 내가 거의 동일한 코드를 사용하고 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 (색인) .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(); 
    } 

}