You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
309 lines
7.9 KiB
309 lines
7.9 KiB
|
|
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;
|
|
//Take a picture
|
|
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[]{"Beauty", "Cold", "sunrise","sketch","White cat", "romantic", "Original image"};
|
|
|
|
@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类型
|
|
beautyTypeSelector = findViewById(R.id.beauty_type_selctor);
|
|
//Mute
|
|
btnMute = findViewById(R.id.button_mute);
|
|
//Take a picture
|
|
img_photo = findViewById(R.id.img_photo);
|
|
}
|
|
|
|
private void initListener(){
|
|
|
|
ArrayAdapter<String> 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("Unmute");
|
|
else
|
|
btnMute.setText("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 a picture
|
|
* @param data Preview data
|
|
* @param width Picture width
|
|
* @param height 图片高度
|
|
*/
|
|
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_openGL" + ".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) {
|
|
// TODO Auto-generated method stub
|
|
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();
|
|
System.exit(0);
|
|
}
|
|
|
|
@Override
|
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
|
if(permissions.length > 0 && grantResults.length > 0){
|
|
Log.i(TAG, "permission=" + permissions[0] + "----grantResult=" + grantResults[0]);
|
|
|
|
setPreviewResolution(videoWidth, videoHeight);
|
|
|
|
if (!mSmartCameraView.startCamera()) {
|
|
Log.e(TAG, "startCamera error...");
|
|
}
|
|
}
|
|
}
|
|
|
|
} |