2017-03-27 5 views
1

ライブ壁紙にカメラのプレビューを表示する必要があります。 私は既にアンドロイドのために<バージョンを作っています。しかし、それが新しいAPIでどのように動作しているのか理解できません。最も古いカメラは現在廃止されていますwallpaperserviceにcamera2 previewを表示

Googleの例では、xmlとTextureViewに入れていますが、私のニーズにどのように変更できるのか分かりません。

とにかくありがとう!私のコードの下

Googleの例 https://github.com/googlesamples/android-Camera2Basic

スタート壁紙

Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, new ComponentName(this, TransparentWallpaperService.class)); 
startActivity(intent); 

TransparentWallpaperService

public class TransparentWallpaperService extends WallpaperService { 

@Override 
public Engine onCreateEngine() { 
    return new GlowEngine(); 
} 

private class GlowEngine extends Engine { 

    private final Handler handler = new Handler(); 

    private final Runnable viewRunner = new Runnable() { 

     @Override 
     public void run() { 

      drawView(); 

     } 

    }; 

    private boolean visible = true; 
    private CameraView view; 

    public GlowEngine() { 
     super(); 
     view = new CameraView(getBaseContext(), getSurfaceHolder()); 
     handler.post(viewRunner); 
    } 

    @Override 
    public void onVisibilityChanged(boolean visible) { 
     this.visible = visible; 
     if (visible) { 
      handler.post(viewRunner); 
     } 
     else { 
      handler.removeCallbacks(viewRunner); 
     } 
    } 

    @Override 
    public void onSurfaceDestroyed(SurfaceHolder holder) { 
     super.onSurfaceDestroyed(holder); 
     this.visible = false; 
     handler.removeCallbacks(viewRunner); 
    } 

    private void drawView() { 
     view.surfaceChanged(getSurfaceHolder(), OPAQUE, view.getWidth(), view.getHeight()); 
     handler.removeCallbacks(viewRunner); 
     if (visible) { 
      handler.postDelayed(viewRunner, 4000); 
     } 
    } 
} 
} 

CameraViewクラス

public class CameraView extends SurfaceView implements SurfaceHolder.Callback { 

private SurfaceHolder holder; 

private Camera camera; 

public CameraView(Context context) { 

    super(context); 

    camera = getCameraInstance(); 

} 

public CameraView(Context context, SurfaceHolder holder) { 

    this(context); 
    this.holder = holder; 

    holder.addCallback(this); 
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

} 

@Override 
public void surfaceCreated(SurfaceHolder surfaceHolder) { 

    if(camera == null) { 
     camera = getCameraInstance(); 
    } 

    if(camera != null) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } 
     catch (IOException e) { 
      Log.e("CameraView", "Error setting camera preview: " + e.getMessage()); 
     } 
    } 

} 

@Override 
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 

    boolean portrait = true; 

    if (width > 0 && height >0 && width < height){ 
     portrait =true; 
    } else if (width > 0 && height >0 && width > height){ 
     portrait = false; 
    } 

    Camera.Parameters parameters; 
    if (camera == null) { 
     camera = getCameraInstance(); 
    } 
    if (camera != null){ 
     parameters = camera.getParameters(); 
     Camera.Size size = parameters.getPictureSize(); 
     size = parameters.getPreviewSize(); 
     parameters.setPreviewSize(size.width, size.height); 
     if (portrait) { 
      camera.setDisplayOrientation(90); 
     } else { 
      camera.setDisplayOrientation(180); 
     } 
     try { 
      camera.setParameters(parameters); 
      camera.setPreviewDisplay(holder); 
      camera.startPreview(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
    if(camera != null) { 
     try { 
      camera.stopPreview(); 
      camera.release(); 
     } 
     catch (Exception e) { 
      Log.e("CameraView", "Error stopping camera preview: " + e.getMessage()); 
     } 
    } 

} 

private Camera getCameraInstance() { 

    Context context = getContext(); 
    Camera camera = null; 
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
     try { 
      camera = Camera.open(); 
     } 
     catch (Exception e) { 
      Log.e("CameraView", "Error getting camera instance: " + e.getMessage()); 
     } 
    } 
    else { 
     Log.i("CameraView", "No camera found!"); 
    } 
    return camera; 
} 
} 

答えて

0
あなただけの古いAPIを使用し続けることができ

。新しいデバイスでも完全に機能します。

そうしないと、TextureViewをSurfaceViewで簡単に置き換えることができます。 TextureViewのSurfaceTextureからSurfaceを作成する代わりに、SurfaceChangedのSurfaceViewのSurfaceHolderからSurfaceを取得します。

+0

5.0のAndroid搭載デバイスで古いAPIが動作しませんでした。 – Joao

関連する問題