我们知道,我们可以选择TextureView、SurfaceView和GLSurfaceView来进行Android相机预览。
哪一款是相机预览的最佳选择?我关注的是相机的性能。
performance android preview android-camera android-textureview
目的:
我用于SurfaceTexture显示相机预览,并且需要通过从 NDK 获取 GL 上下文在表面上进行绘制。我选择这种SurfaceTexture方法是因为我可以避免相机帧缓冲区从 java 手动传递到 NDK,以节省一些性能。
public class MainActivity extends Activity implements SurfaceTextureListener {
private Camera mCamera;
private TextureView mTextureView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextureView = new TextureView(this);
mTextureView.setSurfaceTextureListener(this);
setContentView(mTextureView);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mCamera = Camera.open();
Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
mTextureView.setLayoutParams(new FrameLayout.LayoutParams(previewSize.width, previewSize.height, Gravity.CENTER));
try {
mCamera.setPreviewTexture(surface);
} catch (IOException t) {
}
mCamera.startPreview();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, …Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用相机功能的 Android 应用程序。我遇到的问题是从前置摄像头获取的图像数据 (byte[]) 在我的三星 s7 和 Nexus 手机上颠倒过来。它在预览中显示正确,但在我按原样保存数据然后在图库中显示图像后,它们全部颠倒了。我知道我可以在保存之前翻转图像数据,但我已经在运行 4.4 (kitkat) 的 blu C 5.0 HD 上测试了代码,并且该手机上的图像数据以正确的方式定向。所以翻转图像总是会导致其他设备上的错误。有人告诉我,这个问题是因为在生产新的三星和 Nexus 手机时,前置摄像头是倒置的,以节省空间。我不确定这是否正确,但如果是这样,如果我翻转所有图像,它会弄乱具有正确相机方向的手机。那么有没有办法在保存图像之前检测图像数据的方向呢?
这是我正在使用的代码:
mCamera.takePicture(null, null, mPicture);
Run Code Online (Sandbox Code Playgroud)
打回来:
private final Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
processCameraCallback(data);
}
};
Run Code Online (Sandbox Code Playgroud)
处理数据:
public void processCameraCallback(byte[] data) {
confirmPhoto(true);
//Make a new empty picture file
try {
pictureFile = Utils.createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
Log.e(TAG, "Failed to create photo file: " …Run Code Online (Sandbox Code Playgroud) 我在 Android 6.1、sdk 23 上使用新的camera2 api。
我有两个请求:预览和静态图像捕获请求。我想让闪光灯在每次静止图像请求时关闭,但没有任何预闪光。现在,我的请求如下所示:
CaptureRequest.Builder requester = mCameraDevice.createCaptureRequest(mCameraDevice.TEMPLATE_STILL_CAPTURE);
requester.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
requester.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
requester.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED);
requester.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
requester.addTarget(mCaptureBuffer.getSurface());
mCaptureSession.capture(requester.build(), null, null);
Run Code Online (Sandbox Code Playgroud)
它似乎适用于一部手机(摩托罗拉 Moto G),但不适用于另一部手机(Nexus 5 - 闪光灯根本无法打开)。我知道 Nexus 的闪光灯可以工作,因为我可以用其他相机应用程序触发它,所以我猜有一些默认值我没有设置。
还有另一种方法可以做到这一点/我可以设置更多标志吗?
谢谢!
编辑:
LIMITED支持camera2的设备。仅仅因为您可以使用相机 2 访问相机并不意味着您可以控制所有功能。查看此答案以了解更多信息 我正在使用 webrtc 示例代码从 Android 设备流式传输到网页。示例代码不具备切换摄像头的功能。我试图解决它,但失败了。该示例使用 VideoCapturerAndroid 类,我发现切换相机使用不同类型的所有建议。
示例的主要部分如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_chat);
ButterKnife.bind(this);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Bundle extras = getIntent().getExtras();
if (extras == null || !extras.containsKey(Constants.USER_NAME)) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
Toast.makeText(this, "Need to pass username to VideoChatActivity in intent extras (Constants.USER_NAME).", Toast.LENGTH_SHORT).show();
finish();
return;
}
this.username = extras.getString(Constants.USER_NAME, "");
this.mCallStatus = (TextView) findViewById(R.id.call_status);
// First, we initiate the PeerConnectionFactory with our application context and some options.
PeerConnectionFactory.initializeAndroidGlobals(
this, // Context
true, // Audio Enabled …Run Code Online (Sandbox Code Playgroud) 我正在 Android 上使用新的 CameraX。
我做了一个基本的应用程序(类似于“入门”),其中有相机预览和亮度分析仪。每一秒我都会在 TextView 中显示我的亮度。
现在,按照 CameraX 指南,我想进行颜色检测。大约每隔一秒,我就希望获得屏幕中心像素的颜色。
事实上,我不知道如何按照与亮度分析仪相同的结构进行颜色检测。
光度分析仪类别:
class LuminosityAnalyzer : ImageAnalysis.Analyzer {
private var lastTimeStamp = 0L
private val TAG = this.javaClass.simpleName
var luma = BehaviorSubject.create<Double>()
override fun analyze(image: ImageProxy, rotationDegrees: Int) {
val currentTimeStamp = System.currentTimeMillis()
val intervalInSeconds = TimeUnit.SECONDS.toMillis(1)
val deltaTime = currentTimeStamp - lastTimeStamp
if(deltaTime >= intervalInSeconds) {
val buffer = image.planes[0].buffer
val data = buffer.toByteArray()
val pixels = data.map { it.toInt() and 0xFF }
luma.onNext(pixels.average())
lastTimeStamp = currentTimeStamp
Log.d(TAG, "Average luminosity: …Run Code Online (Sandbox Code Playgroud) android android-camera kotlin color-detection android-camerax
我正在开发一个 Android 应用程序,有时我必须拍照并将其保存到图库中。相机打开并拍摄照片,但不会将其保存到图库中。这是我的代码:
public class CameraActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camara);
dispatchTakePictureIntent();
}
static final int REQUEST_IMAGE_CAPTURE = 1;
@RequiresApi(api = Build.VERSION_CODES.M)
private void dispatchTakePictureIntent() {
if (checkSelfPermission(Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA},
MY_CAMERA_REQUEST_CODE);
}
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
private static final int MY_CAMERA_REQUEST_CODE = 100;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过动画实现效果,但只有在预览视图处于活动状态后才能实现。原因之一也是为了避免相机绑定后出现闪烁。
我已经设法使用反射 (androidx.camera.core.UseCase) 来做到这一点,但在某些设备上 onUseCaseActive 以奇怪的顺序被多次调用。它首先处于 ACTIVE 状态,然后切换到 INACTIVE,并被多次调用,最后进入 ACTIVE 状态。
所以我的实际问题是:有什么方法可以获取 CameraX 回调,以便我可以根据相机的状态以不同的方式管理我的状态?
我的清单中有以下内容
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
Run Code Online (Sandbox Code Playgroud)
但是我收到这个错误
An error occurred while connecting to camera 0: Status(-8, EX_SERVICE_SPECIFIC): '1: validateClientPermissionsLocked:1165: Caller ... (PID 10153, UID 6049) cannot open camera "0" without camera permission'
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用此代码让相机正常工作
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
} catch (Exception e) {
Log.e("getCameraInstance", "exception", e);
}
return c; // returns null if camera is unavailable
}
Run Code Online (Sandbox Code Playgroud)
如何让这款相机正常工作?
回归。升级插件后,我的应用程序不再启动。
\n这是我的颤振规格:
\nFlutter 已经在稳定频道上更新到最新版本
\nFlutter 3.0.2 \xe2\x80\xa2 通道稳定 \xe2\x80\xa2 https://github.com/flutter/flutter.git
\n框架 \xe2\x80\xa2 修订版 cd41fdd (10 天前) \xe2\x80\xa2 2022-06-08 09:52:13 -0700
\n引擎 \xe2\x80\xa2 修订版 f15f824b57\n工具 \xe2\x80\xa2 Dart 2.17.3 \xe2\x80\xa2 DevTools 2.12.2
\n以前一切正常,但我收到此错误:
\nI/flutter ( 6677): `camera_android` threw an error: Binding has not yet been initialized.\nI/flutter ( 6677): The "instance" getter on the ServicesBinding binding mixin is only available once that binding has been initialized.\nI/flutter ( 6677): Typically, this is done by calling "WidgetsFlutterBinding.ensureInitialized()" or …Run Code Online (Sandbox Code Playgroud) android-camera ×10
android ×8
java ×3
camera ×2
binding ×1
flutter ×1
kotlin ×1
opengl-es ×1
orientation ×1
performance ×1
preview ×1
webrtc ×1