在Android中通过摄像头拍摄照片

在Android中通过摄像头拍摄照片,android,android-camera,android-camera-intent,Android,Android Camera,Android Camera Intent,我正在使用下面的代码单击按钮上的照片 package com.example.clickpic; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import android.app.Activity; import android.content.Intent; import android.graphics.

我正在使用下面的代码单击按钮上的照片

package com.example.clickpic;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.Intent;
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.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
int TAKE_PHOTO_CODE = 0;
public static int count=0;
private ImageView imageView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

//here,we are making a folder named picFolder to store pics taken by the camera using  this application
    final String dir =  Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) +  "/picFolder/"; 
    File newdir = new File(dir); 
    newdir.mkdirs();
    this.imageView = (ImageView)this.findViewById(R.id.imageView1);
  Button capture = (Button) findViewById(R.id.btnCapture);
  capture.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

        // here,counter will be incremented each time,and the picture taken by camera  will be stored as 1.jpg,2.jpg and likewise.
        count++;
        String file = dir+count+".jpg";
        File newfile = new File(file);
        try {
            newfile.createNewFile();
        } catch (IOException e) {}       

        Uri outputFileUri = Uri.fromFile(newfile);

        Intent cameraIntent = new  Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
        startActivityForResult(cameraIntent, 1888); 
    }
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == 1888 && resultCode == RESULT_OK) {  
        Bitmap photo = (Bitmap) data.getExtras().get("data"); 
        imageView.setImageBitmap(photo);
    }  
} 

} 
代码运行得非常好,但它只是打开了摄影机活动。我必须怎么做才能在按钮点击时,它点击一张图片并保存它

现在,这只是打开手机的摄像头应用程序,希望我点击图片并点击OK。我不要这些东西

我想要的是,当我在我的应用程序中点击按钮时,它应该点击一张图片,而不需要我的任何额外输入

编辑 我已经尝试创建自己的相机应用程序,但遇到了一些问题。
这就是为什么我要尝试这种方法

我想要的是,当我从我的应用程序中单击按钮时,它应该会单击一张图片,而不需要我的任何其他输入。-

它不是通过像android.provider.MediaStore.ACTION\u IMAGE\u CAPTURE这样的摄像机意图来实现的。您必须在代码中实现摄像头接口部分,而不使用设备的本机摄像头应用程序


看看

的部分,我已经编写了一个camera类,它可以拍照、安排方向(一些设备默认水平拍照)并保存拍摄的照片。您可以通过以下链接进行检查:

编辑:抱歉,我的示例中没有编写savePhoto函数。现在添加它们

保存照片功能:

public void savePhoto(Bitmap bmp) {

    imageFileFolder = new File(Environment.getExternalStorageDirectory(),
            cc.getDirectoryName());
    imageFileFolder.mkdir();
    FileOutputStream out = null;
    Calendar c = Calendar.getInstance();
    String date = fromInt(c.get(Calendar.MONTH))
            + fromInt(c.get(Calendar.DAY_OF_MONTH))
            + fromInt(c.get(Calendar.YEAR))
            + fromInt(c.get(Calendar.HOUR_OF_DAY))
            + fromInt(c.get(Calendar.MINUTE))
            + fromInt(c.get(Calendar.SECOND));
    imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
    try {
        out = new FileOutputStream(imageFileName);
        bmp.compress(Bitmap.CompressFormat.JPEG, 70, out);
        out.flush();
        out.close();
        scanPhoto(imageFileName.toString());
        out = null;
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void scanPhoto(final String imageFileName) {
    geniusPath = imageFileName;
    msConn = new MediaScannerConnection(MyClass.this,
            new MediaScannerConnectionClient() {
                public void onMediaScannerConnected() {
                    msConn.scanFile(imageFileName, null);

                }

                @Override
                public void onScanCompleted(String path, Uri uri) {

                    msConn.disconnect();

                }
            });
    msConn.connect();
}
扫描照片功能:

public void savePhoto(Bitmap bmp) {

    imageFileFolder = new File(Environment.getExternalStorageDirectory(),
            cc.getDirectoryName());
    imageFileFolder.mkdir();
    FileOutputStream out = null;
    Calendar c = Calendar.getInstance();
    String date = fromInt(c.get(Calendar.MONTH))
            + fromInt(c.get(Calendar.DAY_OF_MONTH))
            + fromInt(c.get(Calendar.YEAR))
            + fromInt(c.get(Calendar.HOUR_OF_DAY))
            + fromInt(c.get(Calendar.MINUTE))
            + fromInt(c.get(Calendar.SECOND));
    imageFileName = new File(imageFileFolder, date.toString() + ".jpg");
    try {
        out = new FileOutputStream(imageFileName);
        bmp.compress(Bitmap.CompressFormat.JPEG, 70, out);
        out.flush();
        out.close();
        scanPhoto(imageFileName.toString());
        out = null;
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public void scanPhoto(final String imageFileName) {
    geniusPath = imageFileName;
    msConn = new MediaScannerConnection(MyClass.this,
            new MediaScannerConnectionClient() {
                public void onMediaScannerConnected() {
                    msConn.scanFile(imageFileName, null);

                }

                @Override
                public void onScanCompleted(String path, Uri uri) {

                    msConn.disconnect();

                }
            });
    msConn.connect();
}
SavePhotoTask类:

class SavePhotoTask extends AsyncTask<byte[], String, String> {
    @Override
    protected String doInBackground(byte[]... jpeg) {
        File photo = new File(Environment.getExternalStorageDirectory(),
                "photo.jpg");
        if (photo.exists()) {
            photo.delete();
        }
        try {
            FileOutputStream fos = new FileOutputStream(photo.getPath());
            fos.write(jpeg[0]);
            fos.close();
        } catch (java.io.IOException e) {
        }
        return (null);
    }
}
class SavePhotoTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字节[]…jpeg){
File photo=新文件(Environment.getExternalStorageDirectory(),
“photo.jpg”);
if(photo.exists()){
photo.delete();
}
试一试{
FileOutputStream fos=新的FileOutputStream(photo.getPath());
fos.write(jpeg[0]);
fos.close();
}捕获(java.io.ioe异常){
}
返回(空);
}
}

然后考虑创建你自己的相机Actuvii。但我遇到了一些问题。请帮我解决这个问题我也试过。。但我遇到了一些问题stackoverflow.com/questions/22625904/…。请帮我解决这个问题。这篇文章可能也会有帮助,只需按照文章中给出的说明操作,你就一定能够构建你的相机应用程序。