Android 正在使用的SurfaceView

Android 正在使用的SurfaceView,android,android-camera,android-service,Android,Android Camera,Android Service,我目前正在使用一个活动来使用ICS及以上版本中的摄像头和火炬,我使用SurfaceView,现在我的问题是如何在服务中使用相同的代码,如何创建SurfaceView并使用摄像头 谢谢。服务不是使用这些元素的地方。您将无法执行此操作。您应该使用纹理曲面,而不是曲面视图(可从API 11获得)。请查看。您希望在服务中创建surfaceview,并使用相机视图。源代码在此处 1.在服务示例中创建曲面视图。此解决方案有助于理解如何在服务中创建视图 使用名为WindowManager的类和名为Layout

我目前正在使用一个活动来使用ICS及以上版本中的摄像头和火炬,我使用SurfaceView,现在我的问题是如何在服务中使用相同的代码,如何创建SurfaceView并使用摄像头


谢谢。

服务不是使用这些元素的地方。您将无法执行此操作。

您应该使用
纹理曲面
,而不是
曲面视图
(可从API 11获得)。请查看。

您希望在服务中创建surfaceview,并使用相机视图。源代码在此处

1.在服务示例中创建曲面视图。此解决方案有助于理解如何在服务中创建视图

使用名为WindowManager的类和名为LayoutParams的参数对象。请注意params.type,在不同的SDK版本中可能会失败

在AndroidManifest.xml中

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<service android:name=".FloatWindowService" />
2.将从服务创建的曲面设置为相机示例。 这部分的源代码太多。主要思想是使用classLayoutInflater加载xml文件。然后findViewById获得相机所需的曲面。如例1所示。使用WindowManager添加视图(xml格式)

2.1准备包含曲面视图的xml,名称为cmera\U布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/camera_window_layout"
    android:layout_width="100dip"
    android:layout_height="100dip"
    android:background="@drawable/ic_launcher_background"
    >       
<SurfaceView
    android:id="@+id/camera_surface"
    android:layout_width="80dip"
    android:layout_height="80dip"
    android:layout_gravity="center" />
</LinearLayout>

代码太多了,希望能帮助一些人。

你确定我不能使用类似SurfaceView SView=SurfaceView(this)?Torch应用程序如何像Widget一样保持照明?因为这是我的小部件,我有一个实际的活动,当你打开灯的时候,我仍然在这个问题上的任何帮助?
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/camera_window_layout"
    android:layout_width="100dip"
    android:layout_height="100dip"
    android:background="@drawable/ic_launcher_background"
    >       
<SurfaceView
    android:id="@+id/camera_surface"
    android:layout_width="80dip"
    android:layout_height="80dip"
    android:layout_gravity="center" />
</LinearLayout>
public class FloatWindowCamera extends LinearLayout {
protected  SurfaceView mCameraView; 
public static int viewWidth;
public static int viewHeight;
 private static int statusBarHeight;
private WindowManager mWindowManager;
private WindowManager.LayoutParams mParams;
private float xInScreen;
private float yInScreen;
private float xDownInScreen;
private float yDownInScreen;    
private float xInView;
private float yInView;

public FloatWindowCamera(Context context) {
    super(context);
/************************Main idea here**************************/
    mWindowManager = context.getSystemService(Context.WINDOW_SERVICE);
    LayoutInflater.from(context).inflate(R.layout.cmera_layout, this);
    View view = findViewById(R.id.camera_surface);
    viewWidth = view.getLayoutParams().width;
    viewHeight = view.getLayoutParams().height;
    mCameraView = (SurfaceView) view;
/****************************************************/

}

public SurfaceView getCameraView(){
    return mCameraView;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:           
        xInView = event.getX();
        yInView = event.getY();
        xDownInScreen = event.getRawX();
        yDownInScreen = event.getRawY() - getStatusBarHeight();
        xInScreen = event.getRawX();
        yInScreen = event.getRawY() - getStatusBarHeight();
        break;
    case MotionEvent.ACTION_MOVE:
        xInScreen = event.getRawX();
        yInScreen = event.getRawY() - getStatusBarHeight();         
        updateViewPosition();
        break;      
    default:
        break;
    }
    return true;
}   
public void setParams(WindowManager.LayoutParams params) {
    mParams = params;
}


private void updateViewPosition() {
    mParams.x = (int) (xInScreen - xInView);
    mParams.y = (int) (yInScreen - yInView);
    mWindowManager.updateViewLayout(this, mParams);
}

private int getStatusBarHeight() {
    if (statusBarHeight == 0) {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object o = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = (Integer) field.get(o);
            statusBarHeight = getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return statusBarHeight;


}

}
    public class TopWindowService extends Service
        {
...

    @Override
        public void onCreate()
        {

            super.onCreate();           
/********************add the view in WindowManager**************/

            mView = createCameraWindow(getApplicationContext()).getCameraView();

            //**now you can use this mView to the camera**  then startpreview       


        }

public static FloatWindowCamera createCameraWindow(Context context) {
            WindowManager windowManager = context.getSystemService(Context.WINDOW_SERVICE);
            int screenWidth = windowManager.getDefaultDisplay().getWidth();
            int screenHeight = windowManager.getDefaultDisplay().getHeight();
            if (mCameraWindow == null) {
                mCameraWindow = new FloatWindowCamera(context);
                if (mCameraWindowParams == null) {
                    mCameraWindowParams = new LayoutParams();
                    mCameraWindowParams.type = LayoutParams.TYPE_TOAST ;
                    mCameraWindowParams.format = PixelFormat.RGBA_8888;
                    mCameraWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                            | LayoutParams.FLAG_NOT_FOCUSABLE;
                    mCameraWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
                    mCameraWindowParams.width = FloatWindowCamera.viewWidth;
                    mCameraWindowParams.height = FloatWindowCamera.viewHeight;
                    mCameraWindowParams.x = screenWidth;
                    mCameraWindowParams.y = screenHeight / 2;
                }
                mCameraWindow.setParams(mCameraWindowParams);
//here add the view to show 
                windowManager.addView(mCameraWindow, mCameraWindowParams);
                Log.e("FLOAT","create small success");
            }
            return mCameraWindow;
        }