package com.frank.live; import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.content.res.Configuration; import android.graphics.Bitmap; import android.hardware.Camera; import android.os.Bundle; import android.os.Environment; import androidx.annotation.NonNull; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.Spinner; import com.frank.live.view.SmartCameraView; import com.seu.magicfilter.utils.MagicFilterType; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; public class PushActivity extends Activity implements Callback { private static String TAG = PushActivity.class.getSimpleName(); private SmartCameraView mSmartCameraView; // MagicFilterType magicType = MagicFilterType.SUNRISE; private Button btnMute; private boolean isStart = false; private boolean is_mute = false; private int mDegree; private Spinner beautyTypeSelector; private ImageView img_photo; private boolean takePhoto; private final static int videoWidth = 640; private final static int videoHeight = 360; private final static String[] permissions = new String[]{Manifest.permission.CAMERA}; private final static int CODE_CAMERA = 1001; private final static String[] beautySelector = new String[]{ LiveApplication.getInstance().getString(R.string.effect_beauty), LiveApplication.getInstance().getString(R.string.effect_cool), LiveApplication.getInstance().getString(R.string.effect_sunrise), LiveApplication.getInstance().getString(R.string.effect_sketch), LiveApplication.getInstance().getString(R.string.effect_white), LiveApplication.getInstance().getString(R.string.effect_romantic), LiveApplication.getInstance().getString(R.string.effect_raw) }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestPermissions(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.activity_push); initView(); initListener(); } @TargetApi(23) private void requestPermissions() { requestPermissions(permissions, CODE_CAMERA); } private void initView() { //SurfaceView mSmartCameraView = findViewById(R.id.gl_surfaceview); //beauty type beautyTypeSelector = findViewById(R.id.beauty_type_selector); //mute btnMute = findViewById(R.id.button_mute); //take photo img_photo = findViewById(R.id.img_photo); } private void initListener() { ArrayAdapter adapterBeautyType = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, beautySelector); adapterBeautyType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); beautyTypeSelector.setAdapter(adapterBeautyType); beautyTypeSelector.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { switch (position) { case 0: switchCameraFilter(MagicFilterType.BEAUTY); break; case 1: switchCameraFilter(MagicFilterType.COOL); break; case 2: switchCameraFilter(MagicFilterType.SUNRISE); break; case 3: switchCameraFilter(MagicFilterType.SKETCH); break; case 4: switchCameraFilter(MagicFilterType.WHITECAT); break; case 5: switchCameraFilter(MagicFilterType.ROMANCE); break; default: switchCameraFilter(MagicFilterType.NONE); break; } } @Override public void onNothingSelected(AdapterView parent) { } }); btnMute.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { is_mute = !is_mute; if (is_mute) { btnMute.setText(getString(R.string.voice)); } else { btnMute.setText(getString(R.string.mute)); } } }); //preview data callback(RGBA) mSmartCameraView.setPreviewCallback(new SmartCameraView.PreviewCallback() { @Override public void onGetRgbaFrame(byte[] data, int width, int height) { if (takePhoto) { takePhoto = false; Log.i(TAG, "takePhoto..."); doTakePhoto(data, width, height); } } }); img_photo.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { takePhoto = true; } }); } private void switchCameraFilter(MagicFilterType type) { mSmartCameraView.setFilter(type); } /** * take photo * * @param data preview data * @param width the width of photo * @param height the height of photo */ private void doTakePhoto(byte[] data, int width, int height) { Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); ByteBuffer buffer = ByteBuffer.wrap(data); bitmap.copyPixelsFromBuffer(buffer); Log.i(TAG, "doTakePhoto..."); FileOutputStream fileOutputStream = null; String PATH = Environment.getExternalStorageDirectory().getPath(); String filePath = PATH + File.separator + "hello" + ".jpg"; try { fileOutputStream = new FileOutputStream(filePath); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); fileOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "doTakePhoto error=" + e.toString()); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i(TAG, "surfaceCreated.."); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i(TAG, "surfaceChanged.."); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i(TAG, "Surface Destroyed"); } public void onConfigurationChanged(Configuration newConfig) { try { super.onConfigurationChanged(newConfig); Log.i(TAG, "onConfigurationChanged, start:" + isStart); setCameraDisplayOrientation(this, getCameraId()); mSmartCameraView.setPreviewOrientation(newConfig.orientation, mDegree); } catch (Exception ex) { Log.e(TAG, "error=" + ex.toString()); } } private int getCameraId() { return mSmartCameraView.getCameraId(); } public void setPreviewResolution(int width, int height) { mSmartCameraView.setPreviewResolution(width, height); } private void setCameraDisplayOrientation(Activity activity, int cameraId) { Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; } else { // back-facing result = (info.orientation - degrees + 360) % 360; } Log.i(TAG, "curDegree: " + result); mDegree = result; } @Override protected void onDestroy() { if (isStart) { isStart = false; if (mSmartCameraView != null) { mSmartCameraView.stopCamera(); } Log.i(TAG, "onDestroy StopPublish"); } super.onDestroy(); finish(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (permissions.length > 0 && grantResults.length > 0) { setPreviewResolution(videoWidth, videoHeight); if (!mSmartCameraView.startCamera()) { Log.e(TAG, "startCamera error..."); } } } }