我在Android中尝试使用相机并使用surfaceview思考过度帧,发现了这个例子.. Android creating camera and overrelay frame。例子很棒。
1.开始增强所以改变了potrait和横向框架,当我改变到potrait时相机视图没有显示所以检查并从此链接stackoverflow(changing display orientation)获得了ans,表面中的插入代码已更改为..显示setparameters中的错误,如此删除,它起作用
2.但是当我看到我拍的照片时,它显示的是这样的。
Image。然后再从这个链接获得了ExifInterface(orientatioin)
cambutton.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton
android:id="@+id/btnCapture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="500dp"
android:background="@drawable/cam"
android:layout_centerHorizontal="true"
/>
<ImageButton
android:id="@+id/btnswitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/switchcamera"
android:layout_marginLeft="85dp"
android:layout_marginStart="85dp"
android:layout_marginTop="500dp"
android:layout_toRightOf="@id/btnCapture"
android:layout_toEndOf="@id/btnCapture"
/>
</RelativeLayout>
campotrait.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<SurfaceView
android:id="@+id/cameraSurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/frame3"
/>
</LinearLayout>
camoverrelay1.xml用于横向,与上面相同的代码
Share.java
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class Share extends Activity implements SurfaceHolder.Callback{
private Camera camera = null;
private SurfaceView cameraSurfaceView = null;
private SurfaceHolder cameraSurfaceHolder = null;
private boolean previewing = false;
private Display display = null;
private static int wid = 0, hgt = 0;
private LayoutInflater layoutInflater = null;
private View cameraViewControl = null;
private RelativeLayout.LayoutParams layoutParamsControl = null;
private ImageButton btnCapture = null;
private ImageButton btnswitch = null;
Camera.Size previewSize=null;
Camera.Size optimalSize = null;
Bitmap mBitmap;
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
display = getWindowManager().getDefaultDisplay();
wid = display.getWidth();
hgt = display.getHeight();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.
FLAG_FULLSCREEN, WindowManager.
LayoutParams.FLAG_FULLSCREEN);
int orientation = getResources().getConfiguration().orientation;
/* Camera.Parameters p = camera.getParameters();
p.set("orientation", "portrait");
p.set("rotation", 90);
camera.setParameters(p);*/
if ((orientation == Configuration.ORIENTATION_PORTRAIT)) {
/* camera.setDisplayOrientation(90);*/
setContentView(R.layout.campotrait);
}
else{
/* camera.setDisplayOrientation(180);*/
setContentView(R.layout.cameraoverlay1);
}
cameraSurfaceView = (SurfaceView)findViewById(R.id.cameraSurfaceView);
cameraSurfaceHolder = cameraSurfaceView.getHolder();
cameraSurfaceHolder.addCallback(this);
cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
layoutInflater = LayoutInflater.from(getBaseContext());
layoutParamsControl = new RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.FILL_PARENT,RelativeLayout.LayoutParams.
FILL_PARENT);
cameraViewControl = layoutInflater.inflate(R.layout.cambutton, null);
this.addContentView(cameraViewControl, layoutParamsControl);
btnCapture = (ImageButton)findViewById(R.id.btnCapture);
btnswitch = (ImageButton) findViewById(R.id.btnswitch);
btnCapture.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
camera.takePicture(cameraShutterCallback,
cameraPictureCallbackRaw,
cameraPictureCallbackJpeg);
}
});
btnswitch.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
int camerasNumber = Camera.getNumberOfCameras();
if (camerasNumber > 1) {
//release the old camera instance
//switch camera, from the front and the back and vice versa
openFrontFacingCameraGingerbread();
} else {
Toast toast = Toast.makeText(getApplicationContext(), "Sorry, your
phone has only one camera!", Toast.LENGTH_LONG);
toast.show();
}
}
});
}
private Camera openFrontFacingCameraGingerbread() {
int cameraCount = 0;
Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
try {
cam = Camera.open(camIdx);
} catch (RuntimeException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),"Failed to Open
Front Camera",Toast.LENGTH_SHORT).show();
}
}
}
return cam;
}
Camera.ShutterCallback cameraShutterCallback = new Camera.ShutterCallback()
{
@Override
public void onShutter()
{
}
};
Camera.PictureCallback cameraPictureCallbackRaw =
new Camera.PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
}
};
Camera.PictureCallback cameraPictureCallbackJpeg =
new Camera.PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
// TODO Auto-generated method stub
Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
wid =cameraBitmap.getWidth();
hgt = cameraBitmap.getHeight();
Bitmap newImage = Bitmap.createBitmap(wid,hgt, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newImage);
canvas.drawBitmap(cameraBitmap, 0f, 0f, null);
int orientation = getResources().getConfiguration().orientation;
if ((orientation == Configuration.ORIENTATION_PORTRAIT)){
Drawable drawable = getResources().getDrawable
(R.drawable.potraitimage);
assert drawable != null;
drawable.setBounds(0, 0, wid,hgt);
drawable.draw(canvas);
}
else{
Drawable drawable = getResources().getDrawable
(R.drawable.curtain);
assert drawable != null;
drawable.setBounds(0, 0, wid,hgt);
drawable.draw(canvas);
}
/* Bitmap bitm = null;*/
File storagePath = new File(Environment.
getExternalStorageDirectory() + "/ActEventz/");
storagePath.mkdirs();
File myImage = new File(storagePath, "test.jpg");
ExifInterface exif;
try {
exif = new ExifInterface(storagePath + "test.jpg");
int orient = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, 0);
Log.d("EXIF", "Exif: " + orient);
Matrix matrix = new Matrix();
if (orient == 0) {
matrix.postRotate(0);
Log.d("EXIF", "Exif: " + orient);
} else if (orient == 90) {
matrix.postRotate(0);
Log.d("EXIF", "Exif: " + orient);
}
mBitmap= Bitmap.createBitmap(cameraBitmap, 0,
0,cameraBitmap.getWidth(), cameraBitmap.getHeight(), matrix, true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
mBitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
byte[] byteArray= stream.toByteArray();
Intent i = new Intent(getApplicationContext(), Imageview.class);
Bundle bu = new Bundle();
bu.putByteArray("photo",byteArray );
i.putExtras(bu);
startActivity(i);
try
{
FileOutputStream out = new FileOutputStream(myImage);
newImage.compress(Bitmap.CompressFormat.JPEG, 80, out);
Toast.makeText(getApplicationContext(), "Image Captured",
Toast.LENGTH_SHORT).show();
out.flush();
out.close();
} catch(IOException e)
{
Log.d("In Saving File", e + "");
}
/* Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap bitmap = BitmapFactory.decodeFile(storagePath+"test.jpg");
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap,
hgt,wid,true);
scaledBitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);*/
camera.startPreview();
newImage.recycle();
newImage = null;
cameraBitmap.recycle();
cameraBitmap = null;
}
};
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 200: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] ==PackageManager.
PERMISSION_GRANTED) {
//Permission Granted
} else {
//Permission Denied
}
return;
//Use other case lines for other requests (with different requestCodes)
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height)
{
// TODO Auto-generated method stub
if(previewing)
{
camera.stopPreview();
previewing = false;
}
Camera.Parameters parameters = camera.getParameters();
Display display = ((WindowManager)getSystemService
(WINDOW_SERVICE)).getDefaultDisplay();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
previewSize=previewSizes.get(0);
// You need to choose the most appropriate previewSize for your app
// .... select one of previewSizes here
/* parameters.setPreviewSize(previewSize.width, previewSize.height);*/
if(display.getRotation() == Surface.ROTATION_0)
{
parameters.setPreviewSize(previewSize.height,previewSize.width);
camera.setDisplayOrientation(90);
}
if(display.getRotation() == Surface.ROTATION_90)
{
parameters.setPreviewSize(previewSize.width,previewSize.height);
}
if(display.getRotation() == Surface.ROTATION_180)
{
parameters.setPreviewSize(previewSize.height,previewSize.width);
}
if(display.getRotation() == Surface.ROTATION_270)
{
parameters.setPreviewSize(previewSize.width,previewSize.height);
camera.setDisplayOrientation(180);
}
/*camera.setParameters(parameters);*/
//here error occurs setParameters failed
try
{
camera.setPreviewDisplay(cameraSurfaceHolder);
camera.startPreview();
previewing = true;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// TODO Auto-generated method stub
try
{
camera = Camera.open();
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(), "Device camera is not
working properly, please try after sometime.", Toast.LENGTH_LONG).show();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// TODO Auto-generated method stub
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
}
}
我搜索了很多网站,stackoverflow,我无法得到正确的答案,唯一的错误是相机的捕获视图请建议我解决方案的家伙..我整天都被困在这...谢谢你提前。
答案 0 :(得分:0)
感谢支持人员..我已经通过更改Surface Changed中的一些代码解决了这个问题。我已经删除了ExifInterface部分本身..刚刚在surfacechanged中完成编码,图像保存为预期..:)< / p>
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height)
{
// TODO Auto-generated method stub
if(previewing)
{
camera.stopPreview();
previewing = false;
}
Camera.Parameters parameters = camera.getParameters();
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).
getDefaultDisplay();
int or=cameraInfo.orientation;
// You need to choose the most appropriate previewSize for your app
// .... select one of previewSizes here
/* parameters.setPreviewSize(previewSize.width, previewSize.height);*/
if(display.getRotation() == Surface.ROTATION_0)
{
camera.setDisplayOrientation(90);
or=90;
}
if(display.getRotation() == Surface.ROTATION_180)
{
camera.setDisplayOrientation(270);
or=270;
}
if(display.getRotation() == Surface.ROTATION_270)
{
camera.setDisplayOrientation(180);
or=180;
}
parameters.setRotation(or);
camera.setParameters(parameters);
try
{
camera.setPreviewDisplay(cameraSurfaceHolder);
camera.startPreview();
previewing = true;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}