1d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy/* 2d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * Copyright (C) 2011 The Android Open Source Project 3d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * 4d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * you may not use this file except in compliance with the License. 6d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * You may obtain a copy of the License at 7d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * 8d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * 10d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * Unless required by applicable law or agreed to in writing, software 11d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * See the License for the specific language governing permissions and 14d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy * limitations under the License. 15d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy */ 16d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 17d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guypackage com.android.test.hwui; 18d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 19d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.app.Activity; 20d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.graphics.Bitmap; 21d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.graphics.SurfaceTexture; 22d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.hardware.Camera; 23d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.os.Bundle; 24d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.os.Environment; 25d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.view.Gravity; 26d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.view.TextureView; 27d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.view.View; 28d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.widget.Button; 29d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport android.widget.FrameLayout; 30d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 31d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport java.io.FileNotFoundException; 32d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport java.io.FileOutputStream; 33d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guyimport java.io.IOException; 34d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 35d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy@SuppressWarnings({"UnusedDeclaration"}) 36d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guypublic class GetBitmapActivity extends Activity implements TextureView.SurfaceTextureListener { 37d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy private Camera mCamera; 38d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy private TextureView mTextureView; 39d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 40d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy @Override 41d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy protected void onCreate(Bundle savedInstanceState) { 42d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy super.onCreate(savedInstanceState); 43d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 44d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy FrameLayout content = new FrameLayout(this); 45d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 46d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mTextureView = new TextureView(this); 47d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mTextureView.setSurfaceTextureListener(this); 48d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 49d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy Button button = new Button(this); 50d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy button.setText("Copy bitmap to /sdcard/textureview.png"); 51d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy button.setOnClickListener(new View.OnClickListener() { 52d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy @Override 53d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy public void onClick(View v) { 54d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy Bitmap b = mTextureView.getBitmap(); 55d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy try { 56d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy FileOutputStream out = new FileOutputStream( 57d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy Environment.getExternalStorageDirectory() + "/textureview.png"); 58d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy try { 59d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy b.compress(Bitmap.CompressFormat.PNG, 100, out); 60d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } finally { 61d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy try { 62d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy out.close(); 63d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } catch (IOException e) { 64d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy // Ignore 65d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 66d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 67d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } catch (FileNotFoundException e) { 68d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy // Ignore 69d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 70d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 71d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy }); 72d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 73d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy content.addView(mTextureView, new FrameLayout.LayoutParams(500, 400, Gravity.CENTER)); 74d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy content.addView(button, new FrameLayout.LayoutParams( 75d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, 76d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)); 77d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy setContentView(content); 78d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 79d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 80d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy @Override 81d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 82d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mCamera = Camera.open(); 83d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 84d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy try { 85d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mCamera.setPreviewTexture(surface); 86d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } catch (IOException t) { 87d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy android.util.Log.e("TextureView", "Cannot set preview texture target!", t); 88d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 89d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 90d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mCamera.startPreview(); 91d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 92d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 93d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy @Override 94d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 95d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy // Ignored, the Camera does all the work for us 96d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 97d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy 98d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy @Override 99402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 100d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mCamera.stopPreview(); 101d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy mCamera.release(); 102402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba return true; 103d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy } 104cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba 105cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba @Override 106cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba public void onSurfaceTextureUpdated(SurfaceTexture surface) { 107cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba // Ignored 108cf559377b750271472aa0a717bf3b7d34abc0b39Grace Kloba } 109d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy} 110