X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fai%2Fsuanzi%2Frtmpclient%2FMainActivity.java;h=14b8d5eafa83c7ae75e18af877d2247b1da13242;hb=410441c06aa4257d7d9dcb1b581abb4017c67c50;hp=c309797dcb3b5586399263b9fb1231aa91950196;hpb=791f24bb2d6f4faa5ff14e29c518ca078e9743eb;p=rtmpclient.git diff --git a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java index c309797..14b8d5e 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -1,9 +1,19 @@ package ai.suanzi.rtmpclient; +import android.app.Activity; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.IntentFilter; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.os.Environment; +import android.support.design.widget.TextInputEditText; +import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.view.SurfaceHolder; import android.hardware.Camera; @@ -14,235 +24,398 @@ import android.widget.Toast; import android.content.Context; import android.content.pm.PackageManager; import android.os.AsyncTask; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.io.IOException; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import android.content.Intent; +import java.io.OutputStream; +import android.hardware.usb.UsbManager; +import android.hardware.usb.UsbDeviceConnection; + +import de.mindpipe.android.logging.log4j.LogConfigurator; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import android.net.wifi.WifiManager; +import android.net.wifi.WifiInfo; +import android.content.ServiceConnection; +import android.content.ComponentName; + +import ai.suanzi.rtmpclient.MyService.LocalBinder; +import android.os.IBinder; +import android.net.ConnectivityManager; + +//"rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid"; + +public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback, MyService.MyServiceEventListener{ + + private static final String TAG = "MainActivity"; + //private Ffmpeg ffmpeg; + //private Camera mCamera ; + //private StreamTask mStreamTask; + private SurfaceHolder mHolder; + private SurfaceView mSufaceView; + //private UVCCamera uvcCamera; + //ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + //Intent it = new Intent(getApplicationContext(), MyService.class); + //Intent intent = new Intent(); + + //private UsbManager usbManager; + //private UsbDevice usbCamera; + + private Logger gLogger; + + private Button mBtnStart; + private TextInputEditText mTextServer; + private TextInputEditText mTextUser; + private TextInputEditText mTextCamera; + private String mMacAddr = ""; + //private CameraView mCameraView; + private String mRtmpUrl; + private NetworkMonitor networkMonitor; + private UsbMonitor mUsbMonitor; + + boolean mBounded; + MyService mServer; + Intent mIntent; + + // private ServiceReceiver mServiceReceiver; + + private void configLog(){ + try { + final LogConfigurator logConfigurator = new LogConfigurator(); + String fname = getExternalFilesDir(null) + File.separator + "log.txt"; + logConfigurator.setFileName(fname); + Log.e(TAG, "Log file is located at: " + fname); + logConfigurator.setRootLevel(Level.DEBUG); + logConfigurator.setLevel("org.apache", Level.ERROR); + logConfigurator.setMaxFileSize(1024 * 1024 * 10); + logConfigurator.configure(); + gLogger = Logger.getLogger(getClass()); + } catch (Exception e){ + e.printStackTrace(); + } + } + private void init(){ + configLog(); + gLogger.debug("#######################################"); + // set config file + UserInfo.setConfigPath(getExternalFilesDir(null) + File.separator + "config"); + + this.mMacAddr = getMacAddr(); + mBtnStart = findViewById(R.id.button); + mTextServer = findViewById(R.id.textServer); + mTextUser = findViewById(R.id.textUser); + mTextCamera = findViewById(R.id.textCamera); + mSufaceView = findViewById(R.id.surfaceView); + mHolder = mSufaceView.getHolder(); + mHolder.addCallback(this); + mIntent = new Intent(this, MyService.class); + mUsbMonitor = new UsbMonitor(new UsbMonitor.UsbListener() { + @Override + public void onCameraConnected() { + gLogger.error("onCameraConnected, current Usb Camera count: " + mUsbMonitor.getUsbCameraCount()); + doUnbindService(); + if(mUsbMonitor.hasUsbCamera()){ + doBindService(); + } + } -public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{ + @Override + public void onCameraDisconnected() { + gLogger.error("onCameraDisconnected, current camera count: " + mUsbMonitor.getUsbCameraCount()); + doUnbindService(); + if(mUsbMonitor.hasUsbCamera()){ + doBindService(); + } - private static final String TAG = "PENG"; - private Ffmpeg ffmpeg = new Ffmpeg(); - private Camera mCamera ;//= getCameraInstance(); - private StreamTask mStreamTask; - private SurfaceHolder mHolder; - ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + } + }, this); - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion()); + networkMonitor = new NetworkMonitor(new NetworkMonitor.NetworkListener() { + @Override + public void onWifiConnected() { + gLogger.error("onWifiConnected"); + doBindService(); + } - final Button btn = findViewById(R.id.button); - btn.setText("Start"); - btn.setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View v) { - Log.e(TAG, "Button " + btn.getText() + " onClick"); - if (mCamera == null) return; - if(btn.getText().equals("Start")){ - mCamera.startPreview(); - Camera.Parameters params = mCamera.getParameters(); - //params.setPreviewFpsRange(30000, 30000); - //params.setPictureSize(320, 240); - //params.setPictureFormat(ImageFormat.NV21); - //mCamera.setParameters(params); - - - - - ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height); - } else { - mCamera.setPreviewCallback(null); - Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show(); - ffmpeg.flush(); - ffmpeg.close(); - } - btn.setText(btn.getText().equals("Start") ? "Stop" : "Start"); + public void onWifiDisconnected() { + gLogger.error("onWifiDisconnected"); + doUnbindService(); + } + + @Override + public void onWifiEnabled() { + gLogger.error("onWifiEnabled"); + } + + @Override + public void onWifiDisabled() { + gLogger.error("onWifiDisabled"); } }); + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + registerReceiver(networkMonitor, filter); + } - this.mCamera = getCameraInstance(); - if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras()); - final SurfaceView surfaceView = findViewById(R.id.surfaceView); - mHolder = surfaceView.getHolder(); - mHolder.addCallback(this); + ServiceConnection mConnection = new ServiceConnection() { + @Override + public void onServiceDisconnected(ComponentName name) { + Toast.makeText(MainActivity.this, "Service is disconnected", 1000).show(); + gLogger.error("onServiceDisconnected ---------->"); + mBounded = false; + mServer = null; + } - // - mCamera.setPreviewCallback(this); + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + Toast.makeText(MainActivity.this, "Service is connected", 1000).show(); + gLogger.error("onServiceConnected ---------->"); + mBounded = true; + LocalBinder mLocalBinder = (LocalBinder)service; + mServer = mLocalBinder.getServiceInstance(); + mServer.setServiceEventListener(MainActivity.this); + if(mServer.setRtmpUrl(UserInfo.getConfig().toUrl(mMacAddr))){ + mServer.startPreview(mHolder); + } + } + }; - /*try{ - mCamera.setPreviewTexture(st); - }catch (IOException e){ - e.printStackTrace(); - }*/ + private void doBindService(){ + if(!mBounded && canStartService()) { + gLogger.debug("doBindService"); + bindService(mIntent, mConnection, BIND_AUTO_CREATE); + } + } + private void doUnbindService() { + if(mBounded){ + gLogger.debug("doUnbindService"); + unbindService(mConnection); + mBounded = false; + } } - SurfaceTexture st = new SurfaceTexture(0); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + init(); + loadConfig(); + if(NetworkMonitor.isNetworkAvailable(this) && mUsbMonitor.hasUsbCamera()){ + gLogger.error("Current network is available"); + doBindService(); + } else { + gLogger.error("Current network is NOT available"); + } + + mBtnStart.setText("start"); + mBtnStart.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View view){ + gLogger.error("----------> onClick"); + saveConfig(); + doUnbindService(); + } + }); + } @Override protected void onPause(){ super.onPause(); - Log.e(TAG, "OnPause"); - //ffmpeg.flush(); - //ffmpeg.close(); + gLogger.error("OnPause --------->"); } @Override protected void onResume() { super.onResume(); - Log.e(TAG, "OnResume"); + gLogger.error("OnResume ---------> "); } @Override protected void onStop() { super.onStop(); - Log.e(TAG,"onStop"); + gLogger.debug("onStop --------->"); } @Override protected void onStart(){ super.onStart(); - Log.e(TAG,"onStart"); + gLogger.debug("onStart --------->"); } @Override protected void onDestroy(){ super.onDestroy(); - Log.e(TAG,"onDestroy"); + unregisterReceiver(networkMonitor); + gLogger.debug("onDestroy --------->"); } @Override protected void onRestart(){ - super.onStart(); - Log.e(TAG,"onRestart"); - } - - // class StreamTask AsyncTask - private class StreamTask extends AsyncTask{ - private byte[] data; - - StreamTask(byte[] data){ - this.data = data; - } - - @Override - protected Void doInBackground(Void... params) { - - if (this.data != null){ - Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate()); - ffmpeg.process(this.data); - } - return null; - } + super.onRestart(); + gLogger.debug("onRestart ---------->"); } // SurfaceHolder.Callback implementation @Override public void surfaceCreated(final SurfaceHolder holder){ - Log.e(TAG,"SurfacedCreated"); - try { - mCamera.setPreviewDisplay(holder); - //mCamera.startPreview(); - } catch (IOException e) { - Log.d(TAG, "Error setting camera preview: " + e.getMessage()); - } + gLogger.error("SurfacedCreated"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){ - Log.e(TAG, "surfaceChanged"); - //if(mCamera==null) return; - //Camera.Parameters parameters=mCamera.getParameters(); - //parameters.setPreviewSize(640,480); - //parameters.setPictureSize(640,480); - //mCamera.setParameters(parameters); + gLogger.error("surfaceChanged"); + mHolder = holder; + if (mServer != null) { + mServer.startPreview(holder); + } } @Override - public void surfaceDestroyed(SurfaceHolder holder){ - Log.e(TAG, "surfaceDestroyed"); + public void surfaceDestroyed(SurfaceHolder holder){ gLogger.debug("surfaceDestroyed"); } - private long encodeCount = 0; - private long count = 0; - private long previewTime; - // Camera.PreviewCallback @Override public void onPreviewFrame(final byte[] data, Camera camera){ - /*if (null != mStreamTask){ - switch (mStreamTask.getStatus()){ - case RUNNING: - Log.e(TAG, "onPreviewFrame Running"); - return; - case PENDING: - Log.e(TAG,"OnPreviewFrame Pending"); - mStreamTask.cancel(false); - break; - } - } - mStreamTask = new StreamTask(data); - mStreamTask.execute((Void)null);*/ + gLogger.error("onPreviewFrame"); + } - long endTime = System.currentTimeMillis(); - mExecutor.execute(new Runnable() { - @Override - public void run() { - long encodeTime = System.currentTimeMillis(); - ffmpeg.process(data); - Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime)); - } - }); - Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:" - + (endTime - previewTime) + " " + Thread.currentThread().getName()); - previewTime = endTime; + private String getMacAddr() { + WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); + WifiInfo info = manager.getConnectionInfo(); + return info.getMacAddress().replace(":", ""); //02:00:00:00:00:00 - 020000000000 } - // private - private boolean checkCameraHardware(Context context) { - return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); + private void loadConfig() { + UserInfo info = UserInfo.getConfig(); + gLogger.error("server is:" + info.server); + mTextServer.setText(info.server.equals("") ? "rtmp://gpussh.suanzi.ai:1935/myapp" : info.server); + mTextUser.setText(info.user); + mTextCamera.setText(info.cameraId); + //mMacAddr = info.macAddr.equals("") ? this.mMacAddr : info.macAddr; + gLogger.error("loadConfig - url is :" + info.toUrl(mMacAddr)); } - private static Camera getCameraInstance(){ - Camera c = null; - try { - Log.e(TAG, "Open Camera"); - c = Camera.open(0); - Camera.Parameters params = c.getParameters(); - Log.e(TAG, "Camera parameters: " + params.getPreviewSize().width + "x" + params.getPreviewSize().height); - // NV21 : 17, JPEG 256 - Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat()); - List fps = params.getSupportedPreviewFpsRange(); - for(int[] i : fps){ - Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n"); - } + private void saveConfig() { + UserInfo info = UserInfo.getConfig(); + info.update(mTextServer.getText().toString(), mTextUser.getText().toString(), mMacAddr, mTextCamera.getText().toString()); + if(info.saveConfig()) { + Toast.makeText(getApplicationContext(), "Config saved", Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getApplicationContext(), "Error: config saved", Toast.LENGTH_LONG).show(); + } + gLogger.error("saveConfig - url: " + info.toUrl(mMacAddr)); + } + private boolean canStartService(){ + //gLogger.debug("canStartService - Camera: " + mUsbMonitor.hasUsbCamera() + ". Network: " + NetworkMonitor.isNetworkAvailable()); + return mUsbMonitor.hasUsbCamera() && NetworkMonitor.isNetworkAvailable(this); + } + // MyServiceEventListener + @Override + public void onCameraError(String msg){ + gLogger.error("onCameraEvent " + msg); + } - Camera.Parameters parameters = c.getParameters(); - //List sizes = parameters.getSupportedPreviewSizes(); - List sizes = parameters.getSupportedPictureSizes(); - for (Camera.Size cc : sizes){ - Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height); - } - Camera.Size cs = sizes.get(3); - params.setPreviewSize(cs.width, cs.height); - params.setPictureSize(cs.width, cs.height); - params.setPictureFormat(ImageFormat.NV21); - c.setParameters(params); - } - catch (Exception e){ - e.printStackTrace(); - } - return c; + @Override + public void onEncoderError(String msg){ + gLogger.error("onEncoderEvent: " + msg); } + @Override + public void onIsPreviewing(String msg){ + gLogger.error("onIsPreviewing: " + msg); + } + + +// class ServiceReceiver extends BroadcastReceiver{ +// @Override +// public void onReceive(Context context, Intent intent) { +// String value = intent.getStringExtra("extra_data"); +// gLogger.error("ServiceReceiver onReceive - " + value); +// } +// } + +// private void changePermission(){ +// try { +// Log.e(TAG, "change permission"); +// //Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "chmod 666 /dev/video0"}); +// +// Process sh = Runtime.getRuntime().exec("/system/xbin/su", null,null); +// //Process sh = Runtime.getRuntime().exec("su", null,null); +// +// OutputStream os = sh.getOutputStream(); +// os.write(("/system/bin/chmod 666 /dev/video0").getBytes("ASCII")); +// //os.write(("/system/bin/echo 'wowo' >> /data/local/test").getBytes("ASCII")); +// os.flush(); +// os.close(); +// sh.waitFor(); +// +// +// }catch (Exception e){ +// e.printStackTrace(); +// } +// } +// +// private boolean checkCameraHardware(Context context) { +// return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); +// } +// +// private static Camera getCameraInstance(){ +// Camera c = null; +// try { +// Log.e(TAG, "Open Camera"); +// c = Camera.open(1); +// } catch (Exception e){ +// e.printStackTrace(); +// } +// return c; +// } +// +// private void configCamera(Camera camera){ +// Camera.Parameters paras = camera.getParameters(); +// gLogger.error("Supported Picture Sizes:"); +// for (Camera.Size cc : paras.getSupportedPictureSizes()){ +// gLogger.error(cc.width + "x" + cc.height); +// } +// gLogger.error("Supported Preview fps range:"); +// for(int[] i : paras.getSupportedPreviewFpsRange()){ +// gLogger.error("[" + i[0] + "," + i[1] + "]"); +// } +// gLogger.error("Set parameters"); +// camera.setParameters(paras); +// camera.setDisplayOrientation(0); +// gLogger.error("Preview Format: " + paras.getPreviewFormat() + ". Size: " + paras.getPreviewSize().width + "x" + paras.getPreviewSize().height); +// gLogger.error("Picture Format: " + paras.getPictureFormat() + ". Size: " + paras.getPictureSize().width + "x" + paras.getPictureSize().height); +// +// try { +// camera.setPreviewDisplay(mHolder); +// } catch (IOException e){ +// e.printStackTrace(); +// } +// //camera.setPreviewCallback(this); +// } +// +// private void switchToBackground(){ +// Intent i = new Intent(); +// i.setAction(Intent.ACTION_MAIN); +// i.addCategory(Intent.CATEGORY_HOME); +// this.startActivity(i); +// } }