I would like to use TextureView to show camera preview in it. Finally i want to set opacity for camera preview, using TextureView. But i have problem:
10-22 12:21:14.773: W/TextureView(5126): A TextureView or a subclass can only be used with hardware acceleration enabled.
Here is my class code:
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;
}
}
I have hardware acceleration set to true in the manifest:
<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?
You should set this in you manifest.xml.
Where you declare this it's up to where you want to use your
TextureView
,you used it in your service.so you should declare this in your service declaration.try using this...
This worked for me