Java android应用程序在保存照片时崩溃
我一直在跟着《摄影指南》从 在我拍完照片并选择勾号接受图像之前,一切都正常。然后我得到了可怕的“不幸的是,应用程序已经停止工作”。我正在一台真正的Nexus5设备上测试 我的代码是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
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
objectdata
获取数据时,就会发生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
objectdata
获取数据时,就会发生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
。因此,使用意图数据进行验证在这里不是一种方法。这很有效!非常感谢,我知道这会很简单,对你来说,这很有意义,对你来说,这很有意义