我想使用相机预览进行图像识别.出于我的目的,我需要尽可能高的预览分辨率(同时,向用户显示预览).
我创建了一个Preview类,扩展了SurfaceView并将PreviewSize设置为1280x720.我添加了一个PreviewCallBack来获取实时图像:
camera = Camera.open();
parameters = camera.getParameters();
parameters.setPreviewSize(1280,720);
camera.setParameters( parameters);
byte[] b = new byte[camera.getParameters().getPreviewSize().width *
camera.getParameters().getPreviewSize().height *
ImageFormat.getBitsPerPixel(camera.getParameters().getPreviewFormat()) / 8];
camera.addCallbackBuffer(b);
camera.setPreviewCallbackWithBuffer(new CameraPreviewCallback());
try {
camera.setPreviewDisplay(this.getHolder());
camera.startPreview()
}
Run Code Online (Sandbox Code Playgroud)
我的字节数组b是1382400字节,我的CameraPreviewCallback.onPreviewFrame()函数接收那些1382400字节 - 但只有第一个497664字节包含数据(匹配768x432分辨率(HTC Desire)).
我在不同的设备上进行了测试,显示分辨率为800x480(HTC Desire,LG Optimus 3D,三星Galaxy S2,三星Galaxy Tab,......).我的代码唯一适用的设备是HTC Desire HD.
有谁知道如何作为字节数组获得完整的720p分辨率?"Something"似乎降低了预览分辨率以适应智能手机显示屏.
问候
Joern
我已经构建了一个应用程序,可以在您触摸预览时拍照.我可以拍很多照片,但有时当我触摸预览拍照时,没有快门声,整个应用都冻结了.此外,在那之后,如果我尝试启动内置相机应用程序,我收到一条消息,说明相机无法使用.
我不知道这种行为的原因,它是随机发生的,当它发生时我必须重新启动设备(三星Galaxy S)才能再次使用相机.
在DDM中,崩溃后我可以看到以下行:keyDispatchingTimedOut
以下是相关代码:CameraActivity类:
public class CameraActivity extends Activity {
private static final String TAG = "CameraDemo";
Preview preview;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
preview = new Preview(this);
((FrameLayout) findViewById(R.id.preview)).addView(preview);
((FrameLayout) findViewById(R.id.preview)).setOnTouchListener(preview);
Log.d(TAG, "Camera Activity Created.");
}
}
Run Code Online (Sandbox Code Playgroud)
预览课程:
class Preview extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener {
private static final String TAG = "Preview";
SurfaceHolder mHolder;
public Camera camera;
Context ctx;
boolean previewing = false;
Preview(Context context) {
super(context);
ctx = context;
// Install a SurfaceHolder.Callback so …Run Code Online (Sandbox Code Playgroud) 我试图搜索这个问题很多,但从未见过任何令人满意的答案,所以现在我有最后的希望.
我有一个onPreviewFrame回调设置.这给出了一个byte[]支持预览格式的原始帧(NV21带H.264编码类型).
现在,问题是回调始终开始byte[]从固定方向给出帧,每当设备旋转它不反映到捕获的byte[]帧.我曾尝试与setDisplayOrientation和setRotation,但这些API的只反映了正在显示不是所有捕获的预览byte []框.
Android文档甚至说,Camera.setDisplayOrientation只影响显示预览,而不影响帧字节:
这不会影响onPreviewFrame(byte [],Camera),JPEG图片或录制视频中传递的字节数组的顺序.
最后,在任何API级别,有没有办法改变byte[]帧的方向?
我有自定义相机应用程序.当我将手机旋转90度时,相机预览工作正常.但是当我将手机快速旋转180度时,相机预览会颠倒过来.有没有解决方案......
这是我的代码如下:
public class CustomCameraActivity extends Activity implements
SurfaceHolder.Callback {
Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;
private Sensor mOrientaion1;
int cameraId = 0;
public final String TAG = "CustomCamera";
private SensorManager sensorManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
context = this;
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mOrientaion1 = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
imageView = (ImageView) findViewById(R.id.imgError);
getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = (SurfaceView) findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
controlInflater = LayoutInflater.from(getBaseContext()); …Run Code Online (Sandbox Code Playgroud) 我有兴趣为Android编写一个应用程序,在应用程序中的某个事件后,使用Android上的相机自动拍摄照片.
我需要的东西:
没有预览照片
没有按钮供用户按下拍照
只需运行操作即可拍照并将其存储到相册中.
这是我在线教程尝试的一些代码:
public void snap(){
mCamera = Camera.open();
SurfaceView sv = new SurfaceView(getApplicationContext());
try {
mCamera.setPreviewDisplay(sv.getHolder());
parameters = mCamera.getParameters();
//set camera parameters
mCamera.setParameters(parameters);
mCamera.startPreview();
mCamera.takePicture(null, null, mCall);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Get a surface
sHolder = sv.getHolder();
}
Camera.PictureCallback mCall = new Camera.PictureCallback()
{
public void onPictureTaken(byte[] data, Camera camera)
{
//decode the data obtained by the camera into a Bitmap
FileOutputStream outStream = null;
try{
outStream = …Run Code Online (Sandbox Code Playgroud) 我编写了一个以编程方式捕获照片的Android活动.我想将图像保存为具有正确EXIF方向数据的JPEG(就像原生Android Camera应用程序自动执行一样).
这是实际拍摄照片的方法(我删除了try/catch块):
private void takePhoto() {
camera = Camera.open();
SurfaceTexture dummySurfaceTexture = new SurfaceTexture(0);
camera.setPreviewTexture(dummySurfaceTexture);
camera.startPreview();
camera.takePicture(null, null, jpgCallback);
}
Run Code Online (Sandbox Code Playgroud)
...和回调:
private Camera.PictureCallback jpgCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
releaseCamera();
savePhoto(data);
};
Run Code Online (Sandbox Code Playgroud)
照片拍摄得当,但我的问题是EXIF数据显示方向设置为"图像方向:顶部,左手",无论设备的方向如何,因此当我上传照片时,它会显示为颠倒或旋转.
我是否真的需要手动捕捉设备方向(滚动,俯仰,方位角)并自己编写EXIF方向?Camera应用程序如何自动正确地写入此数据?有谁知道正确设置此属性的方法?
编辑:我无法使用屏幕方向,因为活动被锁定为纵向模式.
我想在我的应用程序中加入一个相机功能,这将允许视图本身的布局过渡,更改其大小,预览大小和有效处理方向更改.我应该使用TextureView或SurfaceView?
决定决定..
我制作了一个应用程序,它有摄像头和GPS的请求,但是当我执行时,我会多次收到此警告,而不到1秒.
W/Activity:一次只能获取一组权限)
有人可以告诉我为什么吗?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mStatusCamera = intent.getStringExtra("camera");
mScannerView = new ZXingScannerView(this) {
@Override
protected IViewFinder createViewFinderView(Context context) {
return new CustomZXingScannerView(context);
}
};
List<BarcodeFormat> formats = new ArrayList<>();
mListaPassageiros = new ArrayList<>();
formats.add(BarcodeFormat.QR_CODE);
setContentView(mScannerView);
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.M) {
if (!checkPermission()) {
requestPermission();
} else {
executarDepoisDaPermissao();
}
}
}
private boolean checkPermission() {
return (ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(getApplicationContext(), …Run Code Online (Sandbox Code Playgroud) 我使用Camera 1 API构建了一个自定义相机,由于某种原因,它产生非常暗的图片(仅在前置摄像头,后置摄像头工作得非常好).相机预览以正确的亮度显示相机,只有在拍摄图像并将其解码为位图时,它才会显得很暗.我疯狂地谷歌搜索了一段时间,发现这个问题报告了很多次,但找不到工作的解决方案.我正在使用的设备是三星J5.
CameraPreview:
class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String CAMERA = "CAMERA";
private static Camera mCamera;
private final CameraActivity cameraActivity;
private final SurfaceHolder mHolder;
public CameraPreview(Camera camera, CameraActivity cameraActivity) {
super(cameraActivity);
this.cameraActivity = cameraActivity;
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void setCameraDisplayOrientation(int cameraId) {
Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
final int rotation = cameraActivity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees …Run Code Online (Sandbox Code Playgroud) 我有一台 Google Pixel 3,正在使用 Flutter 的相机插件,版本为0.8.1。
CameraPreview模糊、嘈杂、放大,而且通常看起来比 Android 的相机应用程序更糟糕。
这就是我实例化的方式CameraController:
final cameras = await availableCameras();
final controller = CameraController(
cameras[0],
ResolutionPreset.veryHigh,
enableAudio: false,
imageFormatGroup: ImageFormatGroup.yuv420,
);
Run Code Online (Sandbox Code Playgroud)
我尝试了所有 4 个摄像头:
有人遇到这个问题吗?
android-camera ×10
android ×9
camera ×5
java ×2
android-gps ×1
crash ×1
dart ×1
exif ×1
flutter ×1
preview ×1
resolution ×1
rotation ×1
surfaceview ×1
textureview ×1