TextureView с предварительным просмотром камеры

Я хотел бы использовать TextureView, чтобы показать в нем предварительный просмотр камеры. Наконец, я хочу установить непрозрачность для предварительного просмотра камеры, используя TextureView. Но у меня проблема:

10-22 12:21:14.773: W/TextureView(5126): TextureView или подкласс можно использовать только с включенным аппаратным ускорением.

Вот мой код класса:

public class CameraService extends Service implements
    android.view.TextureView.SurfaceTextureListener {

private LayoutInflater layoutInflater;
private Camera mCamera;
private View mCameraView;
private WindowManager mWindowManager;
private TextureView textureView;
private float transparentLevel;

public CameraService() {
    transparentLevel = 0.5F;
}

public void onDestroy() {
    super.onDestroy();
    if (mWindowManager != null && mCameraView != null) {
        mWindowManager.removeView(mCameraView);
    }
    if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}

public int onStartCommand(Intent intent, int i, int j) {
    android.view.WindowManager.LayoutParams layoutparams = new android.view.WindowManager.LayoutParams(
            100, 100, 2006, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, -2);
    mWindowManager = (WindowManager) getSystemService("window");
    layoutInflater = (LayoutInflater) getSystemService("layout_inflater");
    mCameraView = layoutInflater.inflate(R.layout.camera_surface, null);
    textureView = (TextureView) mCameraView.findViewById(R.id.textureView);
    textureView.setSurfaceTextureListener(this);
    textureView.setAlpha(transparentLevel);
    mWindowManager.addView(mCameraView, layoutparams);
    return 1;
}

public void onSurfaceTextureAvailable(SurfaceTexture surfacetexture, int i,
        int j) {
    mCamera = Camera.open();
    try {
        mCamera.setPreviewTexture(surfacetexture);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Parameters tmp = mCamera.getParameters();
    tmp.setPreviewSize(tmp.getSupportedPreviewSizes().get(0).width,tmp.getSupportedPreviewSizes().get(0).height);
    mCamera.setParameters(tmp);
    mCamera.startPreview();

}

public boolean onSurfaceTextureDestroyed(SurfaceTexture surfacetexture) {
    if (mCamera != null) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
    return false;
}

public void onSurfaceTextureSizeChanged(SurfaceTexture surfacetexture,
        int i, int j) {
    if (mCamera != null) {
        Parameters tmp = mCamera.getParameters();
        tmp.setPreviewSize(tmp.getSupportedPreviewSizes().get(0).width,tmp.getSupportedPreviewSizes().get(0).height);
        mCamera.setParameters(tmp);
        mCamera.startPreview();
    }
}

public void onSurfaceTextureUpdated(SurfaceTexture surfacetexture) {
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

}

У меня есть аппаратное ускорение, установленное в манифесте:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

Where is the problem?


person Mikołaj Janeczek    schedule 22.10.2015    source источник
comment
Какое устройство вы пробовали?   -  person Alex Cohn    schedule 22.10.2015
comment
Основная проблема в том, что работает на Galaxy S4, LG G3. Но это дает мне ошибку на LG G2. у него андроид 4.4.2. Так что должно работать, но не работает   -  person Mikołaj Janeczek    schedule 22.10.2015
comment
Кроме того, другие приложения, использующие тот же метод, работают. значит проблема в моем коде   -  person Mikołaj Janeczek    schedule 22.10.2015
comment
Есть признаки того, что аппаратное ускорение на G2 (устройство Tegra4) не совсем отполировано: Ошибка кодека аппаратного ускорения Android Lollipop (H264). LG G2 / Galaxy Альфа. Впрочем, я не говорю о личном опыте.   -  person Alex Cohn    schedule 22.10.2015
comment
Но проблема в том, что это решение работает для одного приложения из Google Play. Я использовал то же решение, и оно не сработало.   -  person Mikołaj Janeczek    schedule 23.10.2015
comment
Вы пытались установить android:hardwareAccelerated="true" для действия, как предложил @ifeego? Вы также можете проверить, ускорено ли представление   -  person Alex Cohn    schedule 23.10.2015
comment
Попробуйте работать без альфы и, возможно, других флагов WindowManager, и если это решит проблему с аппаратным ускорением, восстановите флаги один за другим.   -  person Alex Cohn    schedule 23.10.2015
comment
Нет, смена флага WindowManager мне не помогла :(   -  person Mikołaj Janeczek    schedule 25.10.2015


Ответы (2)


попробуй использовать это...

<uses-feature
        android:name="android.hardware.camera"
        android:required="false"/>
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false"/>

<application
        android:name=".app.ExampleApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:theme="@style/AppTheme"
        android:hardwareAccelerated="true" >

Это сработало для меня

person Vennila    schedule 22.10.2015

Вы должны установить это в файле manifest.xml.

android:hardwareAccelerated="true"

Когда вы объявляете это, это зависит от того, где вы хотите использовать свой TextureView, вы использовали его в своей службе, поэтому вы должны объявить это в своей декларации службы.

<service android:hardwareAccelerated="true"
 /> 
person ifeegoo    schedule 22.10.2015
comment
Да, есть индикатор, который может помечать ‹application поскольку hardwareAccelerated работает не всегда. - person Alex Cohn; 22.10.2015