Я пытаюсь создать поверхностный вид для камеры, чтобы она отображалась на поверхности всякий раз, когда она находится на вид камеры. На данный момент все, что я вижу на экране камеры, - это черный экран. Я попытался посмотреть на Google и здесь, но до сих пор я не нашел то, что искал. Любой может предложить мне какую-то идею.
Изображение камеры Android
Ответ 1
Я написал класс, который может вам помочь.
public class Preview_can_work extends Activity {
private SurfaceView surface_view;
private Camera mCamera;
SurfaceHolder.Callback sh_ob = null;
SurfaceHolder surface_holder = null;
SurfaceHolder.Callback sh_callback = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
surface_view = new SurfaceView(getApplicationContext());
addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
if (surface_holder == null) {
surface_holder = surface_view.getHolder();
}
sh_callback = my_callback();
surface_holder.addCallback(sh_callback);
}
SurfaceHolder.Callback my_callback() {
SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
mCamera.startPreview();
}
};
return ob1;
}
}
в файле манифеста скопируйте этот код для разрешения камеры
<uses-permission android:name="android.permission.CAMERA"/>
Объяснение:
SurfaceView - это тип View, который содержит SurfaceHolder. SurfaceHolder содержит поверхность, на которой мы можем отображать наши медиа (обычно кадры).
mCamera
- это объект Camera, который будет содержать экземпляр камеры.
Если вы хотите сохранить экземпляр Camera по умолчанию, вы можете просто вызвать Camera.open();
Camera mCamera = Camera.open();
Теперь у вас есть открытая камера или у вас есть экземпляр камеры по умолчанию. Теперь вам нужно захватывать кадры с камеры и отображать ее на поверхности. Но вы не можете отобразить его без каких-либо
surface
Здесь surfaceView
предоставляет surfaceHolder
а surfaceHolder
предоставляет surface
для отображения кадров камеры. Теперь, когда surface
будет создана, три функции обратного вызова будут
называется.
1. public void surfaceCreated(SurfaceHolder holder)
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
3. public void surfaceDestroyed(SurfaceHolder holder)
Примечание: - Поверхность будет разрушена, когда ваше приложение перейдет в режим паузы.
surfaceCreated:
surfaceCreated - это функция обратного вызова, которая будет вызываться при создании вашей поверхности. В этом вы можете открыть камеру и установить другие атрибуты.
surfaceChanged
: Это будет surfaceChanged
крайней мере один раз, когда ваша поверхность будет создана. После этого он будет вызываться всякий раз, когда ваша поверхность изменится (при вращении устройства). Здесь вы можете
Начните предварительный просмотр, потому что ваша поверхность уже создана.
surfaceDestroyed
: это будет вызываться каждый раз, когда ваша поверхность будет разрушаться. Теперь, если у вас нет поверхности, то где вы можете отобразить кадры камеры, поэтому я выпустил камеру с помощью
mCamera.release()
. Это очень важно, потому что если ваша активность будет приостановлена, а любая другая попытка будет открывать камеру, она не сможет открыть ее, как у вас.
уже открытая камера. Камера является общим ресурсом, поэтому его может использовать только одно приложение. Так что помните одну вещь, когда вы открываете камеру, а затем всегда отпускайте ее.
stopPreview
: когда вы запускаете предварительный просмотр, ваша камера начинает захватывать ваши кадры и отображать их на поверхности. Теперь, если ваша поверхность разрушена, вам нужно прекратить захват кадров
с камеры, поэтому вы должны вызвать mCamera.stopPreview
.
Ответ 2
Сделайте shure добавлено разрешение:
<uses-permission android:name="android.permission.CAMERA"/>
Также эти свойства окна:
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Поместите некоторый код, если он не работает, чтобы помочь вам