2015-07-10 30 views
6

在我的应用程序捕捉按钮是有捕捉使用设备相机的图像,所以我已经使用了一个方法captureImage()该按钮的单击事件。当我单击按钮空指针异常抛出。我不能了解这是怎么发生的?提前致谢!file-URI上的空指针异常?

捕捉按钮上Create()方法

photoButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      /* 
      Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST);*/ 
      captureImage(); 
     } 
    }); 

captureImage()方法在此方法

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 { 
     return null; 
    } 

    return mediaFile; 
} 

logcat的

java.lang.NullPointerException: file 
     at android.net.Uri.fromFile(Uri.java:447) 
     at com.riafy.user.imagegallerydemo.MainActivity.getOutputMediaFileUri(MainActivity.java:235) 
     at com.riafy.user.imagegallerydemo.MainActivity.captureImage(MainActivity.java:97) 
     at com.riafy.user.imagegallerydemo.MainActivity.access$100(MainActivity.java:29) 
     at com.riafy.user.imagegallerydemo.MainActivity$2.onClick(MainActivity.java:68) 
     at android.view.View.performClick(View.java:4761) 
     at android.view.View$PerformClick.run(View.java:19767) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5312) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 

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

空指针异常

+0

mediaStorageDir是空 – DJphy

回答

1

getOutputMediaFile(type)返回null。

public Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

您正在返回这里:

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

您已经添加下列权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

到您的清单?

+0

一个是getOutputMediaFileUri而另一种是Uri.fromFile(getOutputMediaFile(种)) ; ,不同的方法 – Gibs

+0

看到我编辑的答案。 – barq

+0

嗨barq:你可以给出确切的答案,因为我们仍然得到空指针异常,因为控制进入mediaStorageDir.exists() – Anand

1

我的解决方案很简单。

实现了该错误。 Android Manifest将maxSDKVersion设置为18,以便写入存储。删除后,它完美地工作。

1
File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      Config.IMAGE_DIRECTORY_NAME); 

我直接从Android入门页复制到代码。我的问题是我在模拟器上运行它。因此,我认为我使用的上述代码无法评估我的文件系统。

0

就我而言,我发现SDK版本23和以上可能需要运行时权限来编写外部存储。所以我解决这样的:

public Uri getOutputMediaFileUri(int type) { 
     requestRuntimePermission(); 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

public void requestRuntimePermission() { 
     if (Build.VERSION.SDK_INT >= 23) { 
      if (ContextCompat.checkSelfPermission(context,android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(activity, 
         new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      } 
     } 
    } 

注意:您可以把this代替contextactivity以上(如果适用)