android-get nullpointerexception when try to access video on external storage(sdcard)

1k views Asked by At

In my app, I have a video upload option which allows user to upload the video. everything works fine except when user tried to pick a video from external storage. the app will just crash and give NullPointerException. Can someone please explain why? how come the function works fine when user choose video from gallery or phone storage but not external storage? this is the error message I got

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { act=file:///mnt/sdcard/Android/data/com.dropbox.android/files/scratch/VIDEO0010.mp4 dat=file:///mnt/sdcard/Android/data/com.dropbox.android/files/scratch/VIDEO0010.mp4 }} to activity {com.myactivity.android/com.myactivity.android.Webviewer}: java.lang.NullPointerException

and below is my code

private VideoFileInfo getVideoInfo(Uri uri) {


        String[] projection = { MediaStore.Images.Media.DATA, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.TITLE };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        cursor.moveToFirst(); //this is where the app crashed

        String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
        String fileName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
        int fileSize = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
        long duration = TimeUnit.MILLISECONDS.toSeconds(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)));

        System.out.println("path: " + filePath);
        System.out.println("name: " + fileName);
        System.out.println("size: " + fileSize);
        System.out.println("duration: " + duration);
        vfi.setPathNameSizeDuration(filePath, fileName, fileSize, duration);



    return vfi;
}
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

    switch (requestCode) {

    case FILECHOOSER_REQUESTCODE_VIDEO:     
        if (resultCode == Activity.RESULT_OK) {
            System.out.println("SELECT_AUDIO");
            Uri selectedVideoUri = intent.getData();
            selectedPath = getVideoInfo(selectedVideoUri).getPath();
            System.out.println("SELECT_AUDIO Path : " + selectedPath);
            //bm = BitmapFactory.decodeFile(selectedPath);
            blVideoDail = true;
        }
        break;
    }
}
private void createVideoIntent(){
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("video/*");

    Intent chooser = createVideoChooserIntent(createVideoFromCameraIntent());
    chooser.putExtra(Intent.EXTRA_INTENT, intent);
    startActivityForResult(chooser, FILECHOOSER_REQUESTCODE_VIDEO); 
}
private Intent createVideoChooserIntent(Intent... intents) {
    Intent chooser = new Intent(Intent.ACTION_CHOOSER);
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
    chooser.putExtra(Intent.EXTRA_TITLE, "Please Choose Your Video");
    return chooser;
}
private Intent createVideoFromCameraIntent() {  
    return new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
}

can someone help please? Thanks

the app crashed when hit cursor.moveToFirst();.

FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { act=file:///mnt/sdcard/Android/data/com.dropbox.android/files/scratch/VIDEO0010.mp4 dat=file:///mnt/sdcard/Android/data/com.dropbox.android/files/scratch/VIDEO0010.mp4 }} to activity {com. myactivity .android/com.myactivity.android.Webviewer}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:3387)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3437)
at android.app.ActivityThread.access$1100(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1291)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4945)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.myactivity.android.Webviewer.getVideoInfo(Webviewer.java:455)
at com.myactivity.android.Webviewer.onActivityResult(Webviewer.java:500)
at android.app.Activity.dispatchActivityResult(Activity.java:4740)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3383)
... 11 more
1

There are 1 answers

1
Kunal Kumar On

public void selectFile() { Intent intent = new Intent(); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select a Video "), SELECT_VIDEO);

}

Use the following code to select Video from the phone / card

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == SELECT_VIDEO)
                onSelectFromGalleryResult(data);
            /*
             * else if (requestCode == REQUEST_CAMERA)
             * onCaptureImageResult(data);
             */}
    }
}

@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {
    Uri selectedImageUri = data.getData();
    String[] projection = { MediaColumns.DATA };
    Cursor cursor = managedQuery(selectedImageUri, projection, null, null,
            null);
    int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
    cursor.moveToFirst();

    String selectedImagePath = cursor.getString(column_index);

    File fileUpload = new File(selectedImagePath);
    // selected_image_file.add(fileUpload);
    // new UploadAdvertisement().execute();

    Bitmap bm;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(selectedImagePath, options);
    final int REQUIRED_SIZE = 200;
    int scale = 1;
    while (options.outWidth / scale / 2 >= REQUIRED_SIZE
            && options.outHeight / scale / 2 >= REQUIRED_SIZE)
        scale *= 2;
    options.inSampleSize = scale;
    options.inJustDecodeBounds = false;
    bm = BitmapFactory.decodeFile(selectedImagePath, options);
    ImageView image = new ImageView(getApplicationContext());
    // image.setId(adverticse_image_start_id);
    int width = (int) (getResources().getDimension(R.dimen.dim_100) / getResources()
            .getDisplayMetrics().density);
    int left_margin = (int) (getResources().getDimension(R.dimen.dim_15) / getResources()
            .getDisplayMetrics().density);
    LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(width,
            LayoutParams.MATCH_PARENT);
    param.setMargins(left_margin, 0, 0, 0);

    image.setLayoutParams(param);
    image.setImageBitmap(bm);
    System.out.println("selected video path >>>>" + selectedImagePath);
    if (selectedImagePath != null) {
        new UploadFileToserver().execute();
    }
}

Above code will give you file name of the selected item