Java android应用程序在保存照片时崩溃

Java android应用程序在保存照片时崩溃,java,android,android-camera,Java,Android,Android Camera,我一直在跟着《摄影指南》从 在我拍完照片并选择勾号接受图像之前,一切都正常。然后我得到了可怕的“不幸的是,应用程序已经停止工作”。我正在一台真正的Nexus5设备上测试 我的代码是 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon

我一直在跟着《摄影指南》从

在我拍完照片并选择勾号接受图像之前,一切都正常。然后我得到了可怕的“不幸的是,应用程序已经停止工作”。我正在一台真正的Nexus5设备上测试

我的代码是

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
} 


private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

/* Create a File for saving an image or video */
private static File getOutputMediaFile(int type){

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "SimpleCamera");

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("SimpleCamera", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").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;
}

public void openCamera(View view){
    // create Intent to take a picture and return control to the calling application
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}
在我的舱单上我已经包括了

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
还有我的布局以防万一

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.juliette.simplecamera.MainActivity" >

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="58dp"
    android:text="@string/camera" 
    android:onClick="openCamera"/>

</RelativeLayout>

我知道这个问题与返回原始活动的结果有关,但我不知道如何解决这个问题。任何建议都将不胜感激,我在这方面很新,我假设我犯了一个简单的新手错误

提前谢谢

试试这个

Toast.makeText(MainActivity.this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
试试这个

Toast.makeText(MainActivity.this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();

在这行中发生崩溃…因为,
data
null

Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null}
这一行表示
数据

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null}
因此,当您试图使用
getData()
方法从
Intent
object
data
获取数据时,就会发生
NullPointerException

要防止此
异常
,请检查
数据
是否为
,然后再尝试获取以下数据

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == RESULT_OK) {

        if(data != null) {

            Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
        }
    }
}

在这行中发生崩溃…因为,
data
null

Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null}
这一行表示
数据

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null}
因此,当您试图使用
getData()
方法从
Intent
object
data
获取数据时,就会发生
NullPointerException

要防止此
异常
,请检查
数据
是否为
,然后再尝试获取以下数据

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == RESULT_OK) {

        if(data != null) {

            Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
        }
    }
}

从下面的日志中,它清楚地表明您的
意图数据
null

Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null}
检查
Intent
数据的空值

尝试如下:

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == RESULT_OK && null != data) {

        // Image captured and saved to fileUri specified in the Intent
        Toast.makeText(this, "Image saved to:\n" +
                 data.getData(), Toast.LENGTH_LONG).show();
    } 

从下面的日志中,它清楚地表明您的
意图数据
null

Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show();
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null}
检查
Intent
数据的空值

尝试如下:

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == RESULT_OK && null != data) {

        // Image captured and saved to fileUri specified in the Intent
        Toast.makeText(this, "Image saved to:\n" +
                 data.getData(), Toast.LENGTH_LONG).show();
    } 

MainActivity.java类的第94行是什么?我认为
Intent data
onActivityResult()中是
null
…它是data.getData(),Toast.LENGTH\u LONG).show();从toastdata为空。请检查以下答案。谢谢大家,简单的修复可能会让我多花几个小时的时间。非常感谢!MainActivity.java类的第94行是什么?我认为
Intent data
onActivityResult()中是
null
…它是data.getData(),Toast.LENGTH\u LONG).show();从toastdata为空。请检查以下答案。谢谢大家,简单的修复可能会让我多花几个小时的时间。非常感谢!有时我们会收到
null
数据,即使结果成功,即resultcode是
Activity.result\u OK
。因此,使用
意图数据进行验证在这里不是一种方法。这很有效!非常感谢,我知道这将是一件非常简单的事情,我们将收到
null
数据,即使结果成功,即resultcode是
Activity.result\u OK
。因此,使用
意图数据进行验证在这里不是一种方法。这很有效!非常感谢,我知道这会很简单,对你来说,这很有意义,对你来说,这很有意义