2017-04-15 2 views
-1

그래서 간단한 음악 플레이어를 만드는 방법에 대한 튜토리얼을 따라 Genemotion에서 올바르게 작동합니다. 이제는 휴대폰에서 실행하고 싶지만 충돌이 발생합니다. 처음부터 여기에 여기에 내 코드간단한 mp3 플레이어는 에뮬레이터에서 제대로 작동하지만 실제 장치에서는 작동하지 않습니다.

package com.bignerdranch.android.musicplayer; 

import android.app.ListActivity; 
import android.content.Context; 
import android.database.Cursor; 
import android.media.MediaPlayer; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
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; 

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

public class MainActivity extends ListActivity { 

private static final int UPDATE_FREQUENCY=500; 
private static final int STEP_VALUE=4000; 

private MediaCursorAdapter mediaAdapter=null; 
private TextView selectedfile=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 isMovingSeekBar=false; 

private final Handler handler=new Handler(); 

private final Runnable updatepostionRunnable=new Runnable() { 
    public void run() { 
     updatePostion(); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    selectedfile=(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 
public void onDestroy(){ 
    super.onDestroy(); 

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

    player=null; 
} 

private void startplay(String file){ 
    Log.i("Selected ", file); 
    selectedfile.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); 
    updatePostion(); 
    isStarted=true; 
} 

private void stopplay(){ 
    player.stop(); 
    player.reset(); 
    PlayButton.setImageResource(android.R.drawable.ic_media_play); 
    handler.removeCallbacks(updatepostionRunnable); 
    seekbar.setProgress(0); 

    isStarted=false; 
} 

private void updatePostion(){ 
    handler.removeCallbacks(updatepostionRunnable); 

    seekbar.setProgress(player.getCurrentPosition()); 

    handler.postDelayed(updatepostionRunnable,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(updatepostionRunnable); 
        player.pause(); 

PlayButton.setImageResource(android.R.drawable.ic_media_play); 
       }else{ 
        if (isStarted){ 
         player.start(); 

PlayButton.setImageResource(android.R.drawable.ic_media_pause); 

         updatePostion(); 
        }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){ 
    return false; 
    } 
}; 

private SeekBar.OnSeekBarChangeListener seekBarChanged = new 
SeekBar.OnSeekBarChangeListener(){ 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean 
fromUser) { 
     if (isMovingSeekBar){ 
      player.seekTo(progress); 
      Log.i("OnSeekBarChangeListener","onProgressChanged"); 
     } 
    } 

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

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     isMovingSeekBar=false; 
    } 

}; 



} 

입니다 모니터 오류 일을

04-16 20:25:40.009 2516-2516/? I/SELinux: Function: selinux_android_load_priority [0], There is no sepolicy file. 

04-16 20:25:40.039 2516-2516/? I/SELinux: Function: selinux_android_load_priority , spota verifySig and checkHash pass. priority version is VE=SEPF_GT-I9515_4.4.2_0040 


04-16 20:25:40.039 2516-2516/? I/SELinux: selinux_android_seapp_context_reload: seapp_contexts file is loaded from /data/security/spota/seapp_contexts 
04-16 20:25:40.039 2516-2516/? E/dalvikvm: >>>>> Normal User 
04-16 20:25:40.039 2516-2516/? E/dalvikvm: >>>>> com.bignerdranch.android.musicplayer [ userId:0 | appId:10200 ] 
04-16 20:25:40.039 2516-2516/? D/dalvikvm: Late-enabling CheckJNI 
04-16 20:25:40.139 2516-2516/com.bignerdranch.android.musicplayer I/InstantRun: Instant Run Runtime started. Android package is com.bignerdranch.android.musicplayer, real application class is null. 
04-16 20:25:40.149 2516-2516/com.bignerdranch.android.musicplayer W/InstantRun: No instant run dex files added to classpath 
04-16 20:25:40.169 2516-2516/com.bignerdranch.android.musicplayer W/ApplicationPackageManager: getCSCPackageItemText() 
04-16 20:25:40.169 2516-2516/com.bignerdranch.android.musicplayer I/PersonaManager: getPersonaService() name persona_policy 
04-16 20:25:40.219 2516-2516/com.bignerdranch.android.musicplayer D/AbsListView: Get MotionRecognitionManager 
04-16 20:25:40.239 2516-2516/com.bignerdranch.android.musicplayer D/ProgressBar: setProgressDrawable drawableHeight = 36 
04-16 20:25:40.249 2516-2516/com.bignerdranch.android.musicplayer D/AbsSeekBar: AbsSeekBar Constructor: misSeebarAnimationAvailable = true 
04-16 20:25:40.259 2516-2516/com.bignerdranch.android.musicplayer V/MediaPlayer-JNI: native_setup 
04-16 20:25:40.259 2516-2516/com.bignerdranch.android.musicplayer V/MediaPlayer: constructor 
04-16 20:25:40.259 2516-2516/com.bignerdranch.android.musicplayer V/MediaPlayer: setListener 
04-16 20:25:40.319 2516-2516/com.bignerdranch.android.musicplayer D/AbsListView: onVisibilityChanged() is called, visibility : 4 
04-16 20:25:40.319 2516-2516/com.bignerdranch.android.musicplayer D/AbsListView: unregisterIRListener() is called 
04-16 20:25:40.339 2516-2516/com.bignerdranch.android.musicplayer D/AbsListView: onVisibilityChanged() is called, visibility : 0 
04-16 20:25:40.339 2516-2516/com.bignerdranch.android.musicplayer D/AbsListView: unregisterIRListener() is called 
04-16 20:25:40.339 2516-2516/com.bignerdranch.android.musicplayer D/AbsListView: unregisterIRListener() is called 
04-16 20:25:40.359 2516-2516/com.bignerdranch.android.musicplayer D/AndroidRuntime: Shutting down VM 
04-16 20:25:40.359 2516-2516/com.bignerdranch.android.musicplayer W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x420c3da0) 
04-16 20:25:40.370 2516-2516/com.bignerdranch.android.musicplayer E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.bignerdranch.android.musicplayer, PID: 2516 
                        java.lang.NumberFormatException: Invalid long: "null" 
                         at java.lang.Long.invalidLong(Long.java:124) 
                         at java.lang.Long.parseLong(Long.java:341) 
                         at java.lang.Long.parseLong(Long.java:318) 
                         at com.bignerdranch.android.musicplayer.MainActivity$MediaCursorAdapter.bindView(MainActivity.java:164) 
                         at android.widget.CursorAdapter.getView(CursorAdapter.java:254) 
                         at android.widget.AbsListView.obtainView(AbsListView.java:2694) 
                         at android.widget.ListView.measureHeightOfChildren(ListView.java:1274) 
                         at android.widget.ListView.onMeasure(ListView.java:1186) 
                         at android.view.View.measure(View.java:17387) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352) 
                         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
                         at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
                         at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
                         at android.view.View.measure(View.java:17387) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352) 
                         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
                         at android.view.View.measure(View.java:17387) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352) 
                         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
                         at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
                         at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
                         at android.view.View.measure(View.java:17387) 
                         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5352) 
                         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
                         at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2533) 
                         at android.view.View.measure(View.java:17387) 
                         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2215) 
                         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352) 
                         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1551) 
                         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1236) 
                         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6473) 
                         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803) 
                         at android.view.Choreographer.doCallbacks(Choreographer.java:603) 
                         at android.view.Choreographer.doFrame(Choreographer.java:573) 
                         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789) 
                         at android.os.Handler.handleCallback(Handler.java:733) 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                         at android.os.Looper.loop(Looper.java:157) 
                         at android.app.ActivityThread.main(ActivityThread.java:5356) 
                         at java.lang.reflect.Method.invokeNative(Native Method) 
                         at java.lang.reflect.Method.invoke(Method.java:515) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 

    at dalvik.system.NativeStart.main(Native Method) 

도와 줘요 그리고이 가장 가능성이 당신

+0

스택 추적을 읽었습니까? (당신은 그 텍스트를 btw가 아닌 ​​스크린 샷으로 게시 할 필요가 있습니다.) 당신이'Adapter'의'bindView() '에서 널에'Long.parseLong()'을 호출했기 때문에'NumberFormatException'을 얻었습니다. '메소드를 호출합니다. –

+0

스택 추적을 업로드했습니다. 예, 읽었습니다. Long.parseLong()이 null 인 이유는 무엇입니까? – Hama

+0

그래, 분명히 'DURATION' 열은 예상 한 것을 반환하지 않습니다. 또는 가끔은 가치가 없다고 생각한다면, 그 가치를 고려하지 않을 것입니다. 'getString()'대신'cursor.getLong()'을 사용할 수 있으며,'Long.parseLong()'호출을 모두 삭제할 수 있습니다. 값. –

답변

0

감사 때문에 에뮬레이터와 드 두 개의 다른 리소스 버킷에서 서로 다른 두 개의 XML 레이아웃 파일을 사용하고 있습니다. 그것은 findViewById을 수행하고 뷰가 제공되는 레이아웃 파일에서 찾을 수 없기 때문에

https://developer.android.com/guide/practices/screens_support.html

당신은, 어댑터의 결합 방법에 널 포인터를 얻고있다. 그러면 null이 반환되고 null에서 메서드를 호출하면 충돌이 발생합니다.

해결 방법 : 사용하는 레이아웃 파일 (listitem.xml)을 찾고 해당 뷰 버킷에서 예상 한 뷰를 업데이트하거나 삭제하여 정확한 xml 파일 (에뮬레이터가 사용하는 파일)로 다시 가져옵니다.).

+0

"업데이트"란 무엇을 의미합니까? 구성 요소 이름을 확인 하시겠습니까? – Hama

+0

"update it"= xml 레이아웃 파일을 열고 모든보기가 있고 'android : id'를 사용하고 있는지 확인하십시오. – Blundell

관련 문제