-2

我是新来的android开发。我有一个按钮可以捕获点击图像。在按钮上单击它会引发空指针异常错误。android - 文件的空指针异常-URI

这是我的主要活动方式

btnCapturePicture.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     captureImage(); 
    } 
    }); 
    /** 
     Record video button click event 
    */ 
    btnRecordVideo.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     // record video 
     recordVideo(); 
     } 
     }); 
    // Checking camera availability 
    if (!isDeviceSupportCamera()) { 
    Toast.makeText(getApplicationContext(), 
    "Sorry! Your device doesn't support camera", 
    Toast.LENGTH_LONG).show(); 
    // will close the app if the device does't have camera 
    finish(); 
    } 
    } 
/** 
 checking device has camera hardware or not 
  */ 
private boolean isDeviceSupportCamera() { 
if (getApplicationContext().getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) { 
// this device has a camera 
return true; 
} else { 
// no camera on this device 
return false; 
} 
} 
/** 
     * Launching camera app to capture image 
     */ 
private void captureImage() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
    // start the image capture Intent 
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 
} 
/** 
     * Launching camera app to record video 
     */ 
private void recordVideo() { 
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); 
    // set video quality 
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);// set the image file 
    // name 
    // start the video capture Intent 
    startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE); 
} 
    /** 
         * Here we store the file url as it will be null after returning from camera 
         * app 
         */ 
    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     // save file url in bundle as it will be null on screen orientation 
     // changes 
     outState.putParcelable("file_uri", fileUri); 
    } 
    @Override 
    protected void onRestoreInstanceState (Bundle savedInstanceState){ 
     super.onRestoreInstanceState(savedInstanceState); 
     // get the file url 
     fileUri = savedInstanceState.getParcelable("file_uri"); 
    } 
    /** 
         * Receiving activity result method will be called after closing the camera 
         * */ 
    @Override 
    protected void onActivityResult (int requestCode, int resultCode, Intent data){ 
     // if the result is capturing Image 
     if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       // successfully captured the image 
       // launching upload activity 
       launchUploadActivity(true); 
      } else if (resultCode == RESULT_CANCELED) { 
       // user cancelled Image capture 
       Toast.makeText(getApplicationContext(), 
         "Sorry! Failed to capture image", Toast.LENGTH_SHORT).show(); 
      } 
     } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       // video successfully recorded 
       //launching upload activity 
       launchUploadActivity(false); 
      } else if (resultCode == RESULT_CANCELED) { 
       // user cancelled recording 
       Toast.makeText(getApplicationContext(), "Sorry! Failed to  record video", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
private void launchUploadActivity(boolean isImage){ 
    Intent i = new Intent(MainActivity.this, UploadActivity.class); 
    i.putExtra("filePath", fileUri.getPath()); 
    i.putExtra("isImage", isImage); 
    startActivity(i); 
} 

/** 
     * Creating file uri to store image/video 
     */ 
public Uri getOutputMediaFileUri(int type) { 
return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** 
     * returning image/video 
     */ 
private static File getOutputMediaFile(int type) { 

    // External sdcard location 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      Config.IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(TAG, "Oops! Failed create "+ Config.IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 
    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.getDefault()).format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator+ "IMG_" + timeStamp + ".jpg"); 
    } else if (type == MEDIA_TYPE_VIDEO) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator+ "VID_" + timeStamp + ".mp4"); 
    } else { 
     return null; 
    } 
    return mediaFile; 
} 
} 

我在清单文件添加权限创建目录,这里是我的manifest.xml文件

android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="11" 
     android:targetSdkVersion="23" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

我的调试器的错误信息是这样的

Process: com.example.sathwik.uploadtrail1, PID: 2406 
       java.lang.NullPointerException: file 
        at android.net.Uri.fromFile(Uri.java:452) 
        at com.example.sathwik.uploadtrail1.MainActivity.getOutputMediaFileUri(MainActivity.java:163) 
        at com.example.sathwik.uploadtrail1.MainActivity.captureImage(MainActivity.java:90) 
        at com.example.sathwik.uploadtrail1.MainActivity.access$000(MainActivity.java:21) 
        at com.example.sathwik.uploadtrail1.MainActivity$1.onClick(MainActivity.java:50) 
+0

看起来像'getOutputMediaFile(整型)''返回null'。使用调试器找出为什么 – Jens

回答

1

我执行你的代码,它正在拍照并存储它。可能是你缺少权限,一旦进入设置>应用程序> YourApp>并检查权限。同时检查'mediaStorageDir'和'mediaFile'不为空。把一些日志放在那里。

+0

返回Uri.fromFile(getOutputMediaFile(type)); –

+1

这应该是一个评论.. –

+0

它的工作..编辑你的答案...我会upvote –

1

从你的清单,它看起来像您不使用
<uses-permission android:name="android.permission.CAMERA" /> ,我发现
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);在你的代码 。

+0

在清单文件中添加了相机权限。仍然抛出相同的错误 –

0

请试试这个功能:

private void captureImage(){ 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
          /* create instance of File with name img.jpg */ 
        File file = new File(Environment.getExternalStorageDirectory() + File.separator + "img.jpg"); 
          /* put uri as extra in intent object */ 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
        intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

        startActivityForResult(intent, 1); 
} 
+0

尝试此功能,仍然是相同的错误 –

+0

添加此权限<使用权限android:name =“android.permission.READ_EXTERNAL_STORAGE”/> <使用权限android:name =“android.permission.WRITE_EXTERNAL_STORAGE”/ >

+0

<使用权限android:name =“android.permission.READ_EXTERNAL_STORAGE”/> –