技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 移动开发 > android > 正文

调用系统相机拍照后应用闪退

来源: 技术CTO 阅读:

我在做一个小应用,调用系统相机进行拍照,将相片保存在sd卡里面,然后再进行处理。现在主要的问题有两个:

1、程序能够实现调用系统相机拍照,但是拍完点击确定之后应用就闪退了,拍的相片能够保存在sd卡里面。个人觉得是重写的onActivityResult出现了问题,但是一直检查不出来……

2、我是使用Genymotion模拟器进行调试(win7平台),但是却经常回遇到模拟器被强制关闭的情况。

请问大神们这是怎么回事呢?下面是我的MainActivity的代码:


package com.example.camera;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity{
Button button1;
Button button2;
private String name;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 =(Button)findViewById(R.id.button1);
name=new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA))+".jpg";
name="IMG_"+name;
button1.setOnClickListener(new OnClickListener(){//设置监听对象
@Override
public void onClick(View v){
//实例化一个intent,并指定action
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用系统相机
//指定一个图片路径对应的file对象
File vfile=new File("/sdcard/DCIM/Camera");
if(!vfile.exists())
{
vfile.mkdirs();//创建文件夹
}
File vFile=new File(vfile,name);
Uri uri=Uri.fromFile(vFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
startActivityForResult(intent,Activity.DEFAULT_KEYS_DIALER);//启动系统相机的activity

}
});
button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==Activity.RESULT_OK)
{
String sdStatus=Environment.getExternalStorageState();
if(!sdStatus.equals(Environment.MEDIA_MOUNTED))
{
Log.i("TestFile","SD card is not avaiable/writable right now");
return;
}
Bundle bundle=data.getExtras();
Bitmap bitmap=(Bitmap)bundle.get("data");
FileOutputStream b=null;//FileOutputStream为文件写入
String fileName="/sdcard/DCIM/Camera"+name;
try{
b=new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, b);
}catch(FileNotFoundException e){
e.printStackTrace();
}finally{
try{
b.flush();
b.close();
}catch(IOException e){
e.printStackTrace();
}
}
((ImageView) findViewById(R.id.imageView)).setImageBitmap(bitmap);
}
}
}

try



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
Log.i("TestFile", "SD card is not avaiable/writable right now");
return;
}
String fileName = "/sdcard/DCIM/Camera/" + name;
((ImageView) findViewById(R.id.imageView1))
.setImageBitmap(BitmapFactory.decodeFile(fileName));
}
}
谢谢你,@hjywyi。
现在不会拍照后应用不会闪退了。但是新的问题又出现了,拍的照片无法读取显示在ImageView中,而且保存在sd卡里面后相册也不能查看……这是为什么呢?
引用 1 楼 hjywyj 的回复:
try



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
Log.i("TestFile", "SD card is not avaiable/writable right now");
return;
}
String fileName = "/sdcard/DCIM/Camera/" + name;
((ImageView) findViewById(R.id.imageView1))
.setImageBitmap(BitmapFactory.decodeFile(fileName));
}
}

谢谢你,@hjywyi。
现在不会拍照后应用不会闪退了。但是新的问题又出现了,拍的照片无法读取显示在ImageView中,而且保存在sd卡里面后相册也不能查看……这是为什么呢?



只有保存到相册的才可以从相册里面看到。如果随便存相册都可以看到,那就神了。
将下面两行代码放到button1.setOnClickListener里的onClick方法里面,还有,我这里显示图片到imageview是没问题的。

name = new DateFormat().format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA))
+ ".jpg";
name = "IMG_" + name;
引用 5 楼 hjywyj 的回复:
将下面两行代码放到button1.setOnClickListener里的onClick方法里面,还有,我这里显示图片到imageview是没问题的。

name = new DateFormat().format("yyyyMMdd_hhmmss",
Calendar.getInstance(Locale.CHINA))
+ ".jpg";
name = "IMG_" + name;

额……按照您的方法,我在genymotion和真机上都进行了调试,但是还是无法显示在ImageView中,我看了一下您的代码,那个ImageView的id我命名为imageview,您的为ImageView1,不过感觉这个应该也不会影响……
引用 4 楼 hslinux 的回复:



只有保存到相册的才可以从相册里面看到。如果随便存相册都可以看到,那就神了。

我是保存在sd卡里面,然后想要对图片进行编辑。拍照后相片会存在sd卡里面,但是像手机自带和相册和第三方应用如美图秀秀都无法看到刚刚拍照存在sd卡里面的相片……(我是把拍照所得的相片保存在系统自带图库的文件夹里面的)
引用 4 楼 hslinux 的回复:



只有保存到相册的才可以从相册里面看到。如果随便存相册都可以看到,那就神了。

我上网找了一下,貌似是由于没有发布广播,我参考了这篇博客:

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^