2

在我的應用中,我有一個允許用戶上傳視頻的視頻上傳選項。除非用戶試圖從外部存儲中選擇視頻,否則一切正常。該應用只會崩潰,並給NullPointerException。有人可以解釋爲什麼嗎?當用戶從圖庫或手機存儲中選擇視頻而不是外部存儲時,該功能如何正常工作?這是錯誤消息我當嘗試訪問外部存儲(SD卡)上的視頻時android-get nullpointerexception

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 

以下是我的代碼

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

可以有人幫忙嗎?謝謝

該應用程序碰撞時撞上了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 
+0

請發佈logcat。告訴我們空行指針異常發生的地方。更好的是,自己看看那條線 - 通常很容易找出... – IanB

+0

是你在真實設備上測試這個代碼嗎? – Mohit

+0

是的。在真實設備上 – user1865027

回答

-1

公共無效選擇文件(){意向意圖=新意圖(); intent.setType(「video/*」); intent.setAction(Intent.ACTION_GET_CONTENT); (Intent.createChooser(意圖,「選擇視頻 」), SELECT_VIDEO);

}

使用下面的代碼從手機/卡

@Override選擇視頻 公共無效onActivityResult(INT requestCode,INT resultCode爲,意圖數據){

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

以上代碼會給你所選項目的文件名稱

+0

私人靜態最終詮釋SELECT_VIDEO = 3;使用它作爲全局變量 –

相關問題