마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android runtime 에러 ㅠㅠ nullPointer !!

0 추천

현재 오픈소스 이용해서 비디오 플레이어를 만들고 있는데요. 오픈소스에서 필요한 부분만 떼온다고 뗴왔는데 자꾸 runtime error가 뜨면서 어플이 바로 중지되요ㅠㅠ

로그는 다음과 같아요

 

12-06 11:18:16.745: I/Process(9117): Sending signal. PID: 9117 SIG: 9
12-06 11:18:21.580: I/DAHYE(9617): MainActivity
12-06 11:18:21.645: D/dalvikvm(9617): GC_FOR_ALLOC freed 140K, 9% free 12433K/13639K, paused 13ms, total 13ms
12-06 11:18:21.665: D/dalvikvm(9617): GC_FOR_ALLOC freed 66K, 10% free 12610K/13895K, paused 10ms, total 10ms
12-06 11:18:21.670: D/AbsListView(9617): Get MotionRecognitionManager
12-06 11:18:21.670: I/DAHYE(9617): MRL 받기 전
12-06 11:18:21.670: I/MainActivity(9617): MRL 값 있음
12-06 11:18:21.670: D/AndroidRuntime(9617): Shutting down VM
12-06 11:18:21.670: W/dalvikvm(9617): threadid=1: thread exiting with uncaught exception (group=0x4169a2a0)
12-06 11:18:21.675: E/AndroidRuntime(9617): FATAL EXCEPTION: main
12-06 11:18:21.675: E/AndroidRuntime(9617): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dhplayer/com.example.dhplayer.MainActivity}: java.lang.NullPointerException
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.ActivityThread.access$700(ActivityThread.java:140)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.os.Handler.dispatchMessage(Handler.java:99)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.os.Looper.loop(Looper.java:137)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.ActivityThread.main(ActivityThread.java:4946)
12-06 11:18:21.675: E/AndroidRuntime(9617): at java.lang.reflect.Method.invokeNative(Native Method)
12-06 11:18:21.675: E/AndroidRuntime(9617): at java.lang.reflect.Method.invoke(Method.java:511)
12-06 11:18:21.675: E/AndroidRuntime(9617): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1036)
12-06 11:18:21.675: E/AndroidRuntime(9617): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:803)
12-06 11:18:21.675: E/AndroidRuntime(9617): at dalvik.system.NativeStart.main(Native Method)
12-06 11:18:21.675: E/AndroidRuntime(9617): Caused by: java.lang.NullPointerException
12-06 11:18:21.675: E/AndroidRuntime(9617): at com.example.dhplayer.MainActivity.onCreate(MainActivity.java:71)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.Activity.performCreate(Activity.java:5206)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
12-06 11:18:21.675: E/AndroidRuntime(9617): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
12-06 11:18:21.675: E/AndroidRuntime(9617): ... 11 more
 
 
아............대체 뭐죠 뭐가 잘못된거죠?ㅠㅠ
 
그리고 현재 메인 액티비티 소스 중에 String MRL = getIntent().getExtras().getString("itemLocation"); 이런 부분이 있더라구요. 알아보니까 이게 뭐 다른 액티비티에서 호출 했을때 받아서 쓰는거라고 하던데요
저는 이 액티비티가 메인으로 쓸거라서 저걸 주석처리 하고 동영상은 sdcard에 있는 것을 가져올 것이라
 String MRL = Environment.getExternalStorageState(); 이렇게 고쳤는데 이래도 괜찮나요?
 
뮤뮤 (770 포인트) 님이 2013년 12월 6일 질문

2개의 답변

0 추천
로그를 보니 MainActivity의 71번 라인에서 오류가 났네요. 코드가 어떻게 되나요?
방귀과장 (18,940 포인트) 님이 2013년 12월 6일 답변
public class MainActivity extends ListActivity {
    private Media mItem;
    private Bitmap mImage;
    private ImageButton mPlayButton;
    private TrackInfo[] mTracks;
    private ArrayList<Media> mItemList;
    private ReadWriteLock mItemListLock;
    private MediaInfoAdapter mAdapter;
    private final static int NEW_IMAGE = 0;
    private final static int NEW_TEXT = 1;
    
    public static final String ACTION_SHOW_PLAYER = "com.example.dhplayer.ShowPlayer";
    public static final String KEY = "MediaActivity.image";
     
    
   
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        Log.i("DAHYE","MainActivity");
       
        setContentView(R.layout.activity_main);
       
         mItemList = new ArrayList<Media>();
         mItemListLock = new ReentrantReadWriteLock();
       
         Log.i("DAHYE","MRL 받기 전");
        //String MRL = getIntent().getExtras().getString("itemLocation");
         String MRL = Environment.getExternalStorageState();
        if (MRL == null)
            return;
        
        Log.i("MainActivity","MRL 값 있음");
        
        mItem = getMediaItem(MRL);
        
       
        // set title
        TextView titleView = (TextView) findViewById(R.id.title);
        titleView.setText(mItem.getTitle());

        // set length
        TextView lengthView = (TextView) findViewById(R.id.length);
        lengthView.setText(Util.millisToString(mItem.getLength()));

        mPlayButton = (ImageButton) findViewById(R.id.play);
        mAdapter = new MediaInfoAdapter(MainActivity.this);
        setListAdapter(mAdapter);

        new Thread(mLoadImage).start();
        
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_SHOW_PLAYER);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.video, menu);
        return true;
    }

     @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putParcelable(KEY, mImage);
        }

        public void onPlayClick(View v) {
            VideoPlayerActivity.start(this, mItem.getLocation());
        }

        Runnable mLoadImage = new Runnable() {
            @Override
            public void run() {
                Lib mLib = null;
                try {
                    mLib = Util.getLibVlcInstance();
                } catch (LibException e) {
                    return;
                }

                mTracks = mLib.readTracksInfo(mItem.getLocation());
                mHandler.sendEmptyMessage(NEW_TEXT);

                Log.i("MainActivity","mTracks, mHandler");
                
                if (mImage == null) {
                    DisplayMetrics screen = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics(screen);
                    int width = Math.min(screen.widthPixels, screen.heightPixels);
                    int height = width * 9 / 16;

                    // Get the thumbnail.
                    mImage = Bitmap.createBitmap(width, height, Config.ARGB_8888);

                    byte[] b = mLib.getThumbnail(mItem.getLocation(), width, height);

                    if (b == null) // We were not able to create a thumbnail for this item.
                        return;

                    mImage.copyPixelsFromBuffer(ByteBuffer.wrap(b));
                    mImage = Util.cropBorders(mImage, width, height);
                }

                mHandler.sendEmptyMessage(NEW_IMAGE);
            }
        };

        private void updateImage() {
            ImageView imageView = (ImageView) MainActivity.this.findViewById(R.id.image);
            imageView.setImageBitmap(mImage);
            mPlayButton.setVisibility(View.VISIBLE);
        }

        private void updateText() {
            for (TrackInfo track : mTracks) {
                if (track.Type != TrackInfo.TYPE_META)
                    mAdapter.add(track);
            }
        }

        private Handler mHandler = new MediaInfoHandler(this);

        private static class MediaInfoHandler extends WeakHandler<MainActivity> {
            public MediaInfoHandler(MainActivity owner) {
                super(owner);
            }

            @Override
            public void handleMessage(Message msg) {
                MainActivity activity = getOwner();
                if(activity == null) return;

                switch (msg.what) {
                    case NEW_IMAGE:
                        activity.updateImage();
                        break;
                    case NEW_TEXT:
                        activity.updateText();
                        break;
                }
            };

        };

public Media getMediaItem(String location) {
    mItemListLock.readLock().lock();
    for (int i = 0; i < mItemList.size(); i++) {
        Media item = mItemList.get(i);
        if (item.getLocation().equals(location)) {
            mItemListLock.readLock().unlock();
            return item;
        }
    }
    mItemListLock.readLock().unlock();
    return null;
}
public ArrayList<Media> getMediaItems(List<String> pathList) {
    ArrayList<Media> items = new ArrayList<Media>();
    for (int i = 0; i < pathList.size(); i++) {
        Media item = getMediaItem(pathList.get(i));
        items.add(item);
    }
    return items;
}

Main Activity 소스는 이렇게 되고,

 public String getTitle() {
        if (mTitle != null && mType != TYPE_VIDEO)
            return mTitle;
        else {
            int end = getFileName().lastIndexOf(".");
            if (end <= 0)
                return getFileName();
            return getFileName().substring(0, end);
        }
    }

오류가 난 71번 줄의 getTitle 함수입니다ㅠㅠ
public String getTitle() {   <-- 이런 메소드 선언부분에 오류가 발생하지 않아요. 정확시 71번 라인의 코드가 뭔가요?
titleView.setText(mItem.getTitle());
이부분입니다!
0 추천
getFileName 메서드는 어디꺼죵
익명사용자 님이 2013년 12월 8일 답변
...