0

Музыкальный плеер работает со смартфонами без внешнего хранилища, и приложение выходит из строя, а смартфоны с внешней памятью работают. Не могли бы вы рассказать мне, почему.Музыкальный проигрыватель для внутреннего хранения

Java класс

import com.google.android.gms.ads.AdRequest; 
import com.google.android.gms.ads.AdView; 

import java.io.IOException; 
import java.math.BigDecimal; 

public class mediaplayer extends ListActivity { 
    private static final int UPDATE_FREQUENCY = 500; 
    private static final int STEP_VALUE = 4000; 

    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 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 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mediaplayer); 
     AdView mAdView = (AdView) findViewById(R.id.adView); 
     AdRequest adRequest = new AdRequest.Builder().build(); 
     mAdView.loadAd(adRequest); 
     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); 

     player = new MediaPlayer(); 

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

     Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, 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); 
     } 
    } 

    @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; 
    } 

    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; 
       } 
      } 
     } 
    }; 

    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"); 
      } 
     } 
    };} 

активность XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#000033" 
    android:keepScreenOn="true" 
    android:orientation="vertical" 
    xmlns:ads="http://schemas.android.com/apk/res-auto"> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="330dp" 
     android:background="#FFFFFF" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="#000033" 
     android:orientation="vertical" 
     android:padding="10dip"> 

     <TextView 
      android:id="@+id/selectedfile" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:ellipsize="middle" 
      android:gravity="center_horizontal" 
      android:singleLine="true" 
      android:text="@string/Notfileselected" 
      android:textColor="@android:color/white" /> 

     <SeekBar 
      android:id="@+id/seekbar" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:max="100" 
      android:paddingBottom="10dip" /> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:background="#000033" 
      android:gravity="center" 
      android:orientation="horizontal"> 

      <ImageButton 
       android:id="@+id/prev" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:contentDescription="@string/app_name" 
       android:src="@android:drawable/ic_media_previous" /> 

      <ImageButton 
       android:id="@+id/play" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:contentDescription="@string/app_name" 
       android:src="@android:drawable/ic_media_play" /> 

      <ImageButton 
       android:id="@+id/next" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:contentDescription="@string/app_name" 
       android:src="@android:drawable/ic_media_next" /> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

listitem.xml

 <?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    tools:context=".mediaplayer$MediaCursorAdapter" 
    android:keepScreenOn="true"> 

    <TextView 
     android:id="@+id/displayname" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:ellipsize="end" 
     android:singleLine="true" 
     android:textSize="18sp" 
     android:textStyle="bold" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <TextView 
      android:id="@+id/duration" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:ellipsize="end" 
      android:gravity="right" 
      android:singleLine="true" 
      android:textSize="15sp" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ellipsize="end" 
     android:singleLine="true" 
     android:textSize="15sp" /> 

</LinearLayout> 

журнал ошибок

java.lang.NumberFormatException: Invalid long: "null" 
at java.lang.Long.invalidLong(Long.java:124) 
at java.lang.Long.parseLong(Long.java:345) 
at java.lang.Long.parseLong(Long.java:321) 
at com.play.mediaplayer$MediaCursorAdapter.bindView(mediaplayer.java:176) 
at com.play.mediaplayer$MediaCursorAdapter.newView(mediaplayer.java:193) 
at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:252) 
at android.widget.AbsListView.obtainView(AbsListView.java:2344) 
at android.widget.ListView.makeAndAddView(ListView.java:1864) 
at android.widget.ListView.fillDown(ListView.java:698) 
at android.widget.ListView.fillFromTop(ListView.java:759) 
at android.widget.ListView.layoutChildren(ListView.java:1673) 
at android.widget.AbsListView.onLayout(AbsListView.java:2148) 
at android.view.View.layout(View.java:15596) 
at android.view.ViewGroup.layout(ViewGroup.java:4966) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
at android.view.View.layout(View.java:15596) 
at android.view.ViewGroup.layout(ViewGroup.java:4966) 
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:508) 
at android.view.View.layout(View.java:15596) 
at android.view.ViewGroup.layout(ViewGroup.java:4966) 
at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494) 
at android.view.View.layout(View.java:15596) 
at android.view.ViewGroup.layout(ViewGroup.java:4966) 
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:508) 
at android.view.View.layout(View.java:15596) 
at android.view.ViewGroup.layout(ViewGroup.java:4966) 
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2072) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1829) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
at android.view.Choreographer.doFrame(Choreographer.java:550) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Спасибо за помощь

+0

Пожалуйста, добавьте ваш след стека. – Muthu

+0

Я добавил журнал, спасибо за помощь –

ответ

0

Поскольку вы запрашиваете файл на внешнем хранилище (MediaStore.Audio.Media.EXTERNAL_CONTENT_URI), телефоны без внешнего хранилища не возвращают результатов для вашего запроса.

Для ручкой пустой результат правильно, попробуйте изменить это:

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

к этому:

//... 
    if (null != cursor && cursor.moveToFirst()) { 
     //... 
    } 

UPDATE

Если вы хотите получить файлы из внутреннее хранилище просто измените вас r запрос к этому:

Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, null, null, null, null); 
+0

Извините, если я не очень хорошо объяснил, но я не владею английским языком. Мне нужен метод для внутреннего хранения. Спасибо за помощь. –

+0

@MichelePio Я обновил свой ответ, попробуйте изменить ваш запрос по моему предложению – bonnyz

+0

Спасибо за ваш ответ, но я нашел только песни системы. –

 Смежные вопросы

  • Нет связанных вопросов^_^