Android: Overlay on Android Camera Preview

后端 未结 6 583
后悔当初
后悔当初 2020-11-27 13:32

I\'m using Camera API and invoking the camera.

I want to display a header (for branding) on the top of the camera preview. The header is a jpeg image.

Is

6条回答
  •  猫巷女王i
    2020-11-27 13:47

    look your XML would be like this:

     
    
    
    
    
    
    
    
    

    and for the java code you should extend SurfaceHolder.Callback in your activity and then attach the camera to the surface view like this,its my full code please be careful with bitmaps and canvas that is the tricky part :

     public class MainActivity extends Activity implements SurfaceHolder.Callback 
    {
      private Camera camera = null;
      private SurfaceView cameraSurfaceView = null;
      private SurfaceHolder cameraSurfaceHolder = null;
      private boolean previewing = false;
      RelativeLayout relativeLayout;
    
    
    
    
    
      private Button btnCapture = null;
      private Button btnsave = null;
      private Button btnshare = null;
      private boolean isSaved=false;
      private boolean isCaptured=false;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) 
      {
        super.onCreate(savedInstanceState);
    
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                             WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
        setContentView(R.layout.activity_main);
    
        relativeLayout=(RelativeLayout) findViewById(R.id.containerImg);
        relativeLayout.setDrawingCacheEnabled(true);
        cameraSurfaceView = (SurfaceView)
                                           findViewById(R.id.surfaceView1);
      //  cameraSurfaceView.setLayoutParams(new FrameLayout.LayoutParams(640, 480));
        cameraSurfaceHolder = cameraSurfaceView.getHolder();
        cameraSurfaceHolder.addCallback(this);
    //    cameraSurfaceHolder.setType(SurfaceHolder.
      //                                               SURFACE_TYPE_PUSH_BUFFERS);
    
    
    
    
        btnCapture = (Button)findViewById(R.id.capturebtn);
        btnCapture.setOnClickListener(new OnClickListener() 
        {   
          @Override
          public void onClick(View v) 
          {
             camera.takePicture(cameraShutterCallback, 
                                           cameraPictureCallbackRaw,
                                           cameraPictureCallbackJpeg);
             isCaptured=true;
          }
        });
        btnsave = (Button)findViewById(R.id.savebtn);
        btnsave.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                 FrameLayout frm = (FrameLayout)findViewById(R.id.frameLayout1);
                    frm.setDrawingCacheEnabled(true);
                    frm.buildDrawingCache();
                    Bitmap bitmap = frm.getDrawingCache();
                    try {
                        File rootFile=new File(Environment.getExternalStorageDirectory().toString()+"/MYCAMERAOVERLAY");
                        rootFile.mkdirs();
                        Random generator = new Random();
                        int n = 10000;
                        n = generator.nextInt(n);
                        String fname = "Image-"+ n +".png";
    
                        File resultingfile = new File(rootFile, fname);
    
                        if (resultingfile.exists ()) resultingfile.delete (); 
                        try {
                               FileOutputStream Fout = new FileOutputStream(resultingfile);
                               bitmap.compress(CompressFormat.PNG, 100, Fout);
                               Fout.flush();
                               Fout.close();
    
                        } catch (FileNotFoundException e) {
                            Log.d("In Saving File", e + "");
                    }
                    } catch(IOException e){
                        Log.d("In Saving File", e + "");
                    }
                    isSaved=true;
                }
            });
        btnshare = (Button)findViewById(R.id.sharebtn);
        btnshare.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                if((isSaved)&&(isCaptured)){
                    // TODO sharing what ever we saved 
                    // take the path
    
    
                }
    
            }
        });
       } 
    
    
      ShutterCallback cameraShutterCallback = new ShutterCallback() 
      {  
        @Override
        public void onShutter() 
        {
          // TODO Auto-generated method stub   
        }
      };
    
      PictureCallback cameraPictureCallbackRaw = new PictureCallback() 
      {  
        @Override
        public void onPictureTaken(byte[] data, Camera camera) 
        {
          // TODO Auto-generated method stub   
        }
      };
    
      PictureCallback cameraPictureCallbackJpeg = new PictureCallback() 
      {  
        @Override
        public void onPictureTaken(byte[] data, Camera camera) 
        {
          // TODO Auto-generated method stub   
          Bitmap cameraBitmap = BitmapFactory.decodeByteArray
                                                                      (data, 0, data.length);
    
       int   wid = cameraBitmap.getWidth();
         int  hgt = cameraBitmap.getHeight();
    
        //  Toast.makeText(getApplicationContext(), wid+""+hgt, Toast.LENGTH_SHORT).show();
          Bitmap newImage = Bitmap.createBitmap
                                            (wid, hgt, Bitmap.Config.ARGB_8888);
    
          Canvas canvas = new Canvas(newImage);
    
          canvas.drawBitmap(cameraBitmap, 0f, 0f, null);
    
          camera.startPreview();
    
          newImage.recycle();
          newImage = null;
    
          Intent intent = new Intent();
          intent.setAction(Intent.ACTION_VIEW);
    
          startActivity(intent);
    
        }
      };
    
      @Override
      public void surfaceChanged(SurfaceHolder holder, 
                                           int format, int width, int height) 
      {
        // TODO Auto-generated method stub
    
        if(previewing)
        {
          camera.stopPreview();
          previewing = false;
        }
        try 
        {
          Camera.Parameters parameters = camera.getParameters();
          parameters.setPreviewSize(640, 480);
          parameters.setPictureSize(640, 480);
          if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
              camera.setDisplayOrientation(-90);
    
          }
    
         // parameters.setRotation(90);
          camera.setParameters(parameters);
    
          camera.setPreviewDisplay(cameraSurfaceHolder);
          camera.startPreview();
          previewing = true;
        } 
        catch (IOException e) 
        {
          // TODO Auto-generated catch block
          e.printStackTrace();  
        }
      }
    
      @Override
      public void surfaceCreated(SurfaceHolder holder) 
      {
        // TODO Auto-generated method stub
        try
        {
          camera = Camera.open();
        }
        catch(RuntimeException e)
        {
          Toast.makeText(getApplicationContext(), "Device camera  is not working properly, please try after sometime.", Toast.LENGTH_LONG).show();
        }
      }
    
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) 
      {
        // TODO Auto-generated method stub
          try{
    
    
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
          }catch(Exception e){
              e.printStackTrace();
          }
      }
    

    }

    and i think now i should give you the full XML part too. so here it is:

      
     
    
        
    
     
    
    
    
    
    
    
    
    
        
    
        
    
        
    
    

    share button doesn't work at this point but it saves the whole frame layout on capture clicked. hope it will be helpful.

提交回复
热议问题