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=5c2e2f9e3d6aa43d684a4371ccbd66b78ec72c7f;hpb=831cc09829bc6e18d8d0d8bb78063e89ea565ce9;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 5c2e2f9..14b8d5e 100644 --- a/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java +++ b/app/src/main/java/ai/suanzi/rtmpclient/MainActivity.java @@ -10,6 +10,7 @@ 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; @@ -42,24 +43,30 @@ 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{ +public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback, MyService.MyServiceEventListener{ - private static final String TAG = "PENG"; - private Ffmpeg ffmpeg; - private Camera mCamera ; - private StreamTask mStreamTask; + 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(); + //private UVCCamera uvcCamera; + //ExecutorService mExecutor = Executors.newSingleThreadExecutor(); //Intent it = new Intent(getApplicationContext(), MyService.class); - Intent intent = new Intent(); + //Intent intent = new Intent(); - private UsbManager usbManager; - private UsbDevice usbCamera; + //private UsbManager usbManager; + //private UsbDevice usbCamera; private Logger gLogger; @@ -68,6 +75,16 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal 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 { @@ -88,249 +105,170 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal private void init(){ configLog(); gLogger.debug("#######################################"); + // set config file UserInfo.setConfigPath(getExternalFilesDir(null) + File.separator + "config"); - this.mMacAddr = getMacAddr(); - - ffmpeg = Ffmpeg.getInstance(); - uvcCamera = new UVCCamera(); + this.mMacAddr = getMacAddr(); mBtnStart = findViewById(R.id.button); mTextServer = findViewById(R.id.textServer); mTextUser = findViewById(R.id.textUser); mTextCamera = findViewById(R.id.textCamera); - loadConfig(); - - // init service - intent.setPackage(this.getPackageName()); - intent.setAction("ai.suanzi.rtmpclient.service"); - - // init surface view mSufaceView = findViewById(R.id.surfaceView); mHolder = mSufaceView.getHolder(); mHolder.addCallback(this); - // camera - mCamera = getCameraInstance(); - configCamera(mCamera); - } + 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(); + } + } + @Override + public void onCameraDisconnected() { + gLogger.error("onCameraDisconnected, current camera count: " + mUsbMonitor.getUsbCameraCount()); + doUnbindService(); + if(mUsbMonitor.hasUsbCamera()){ + doBindService(); + } - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - init(); + } + }, this); - mBtnStart.setOnClickListener(new View.OnClickListener(){ + networkMonitor = new NetworkMonitor(new NetworkMonitor.NetworkListener() { @Override - public void onClick(View view){ - String url = mTextServer.getText().toString() + "/" + mTextUser.getText().toString() + "_" + mMacAddr + "_" + mTextCamera.getText().toString(); - gLogger.error("----------> onClick, Url is: " + url); - intent.putExtra("url", url); - startService(intent); - saveConfig(); - //changePermission(); + public void onWifiConnected() { + gLogger.error("onWifiConnected"); + doBindService(); + } + + @Override + public void onWifiDisconnected() { + gLogger.error("onWifiDisconnected"); + doUnbindService(); } - }); - /*btn2.post(new Runnable(){ @Override - public void run() { - btn2.performClick(); + public void onWifiEnabled() { + gLogger.error("onWifiEnabled"); + } + @Override + public void onWifiDisabled() { + gLogger.error("onWifiDisabled"); } }); - - switchToBackground();*/ - - /* - usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); - HashMap deviceList = usbManager.getDeviceList(); - Log.e(TAG, "device list size : " + deviceList.size()); - Iterator deviceIterator = deviceList.values().iterator(); - PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); - - IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED); - registerReceiver(mUsbReceiver, filter); - filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED); - registerReceiver(mUsbReceiver, filter); - filter = new IntentFilter(ACTION_USB_PERMISSION); - registerReceiver(mUsbReceiver, filter); - - while(deviceIterator.hasNext()){ - UsbDevice device = deviceIterator.next(); - Log.e(TAG, device.toString()); - Log.e(TAG, device.getDeviceName() + " manufacture name: " + device.getManufacturerName() + " " + device.getSerialNumber() + " " + device.getDeviceId()); - - if (device.getVendorId() == 6257){ - usbManager.requestPermission(device, mPermissionIntent); - Log.e(TAG,"XXXXXXXXXXXXXXXXXXXXXXXXXXX"); - Log.e(TAG, device.getVendorId() + "\n" + device.getProductId() + "\n" + device.getProductName() + "\n" + - device.getManufacturerName() + "\n" + device.getDeviceId() + "\n" + device.getSerialNumber() + "\n" + - device.getDeviceName()); - - final String name = device.getDeviceName(); - final String[] v = name.split("/"); - int busnum = 0; - int devnum = 0; - if (v != null) { - busnum = Integer.parseInt(v[v.length-2]); - devnum = Integer.parseInt(v[v.length-1]); - } - //mBusNum = busnum; - //mDevNum = devnum; - uData.vid = device.getVendorId(); - uData.pid = device.getProductId(); - uData.busNum = busnum; - uData.devNum = devnum; - - String result = null; - final String[] vv = name.split("/"); - if ((vv != null) && (vv.length > 2)) { - final StringBuilder sb = new StringBuilder(vv[0]); - for (int i = 1; i < vv.length - 2; i++) - sb.append("/").append(vv[i]); - result = sb.toString(); - } - uData.usbFsName = result; + IntentFilter filter = new IntentFilter(); + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + registerReceiver(networkMonitor, filter); + } - uData.print(); + 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; + } - usbCamera = device; + @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); } + } + }; - //Log.e(TAG, device.) - //device.getInterface() - }*/ + private void doBindService(){ + if(!mBounded && canStartService()) { + gLogger.debug("doBindService"); + bindService(mIntent, mConnection, BIND_AUTO_CREATE); + } } - /*private UsbData uData = new UsbData(); - - private class UsbData { - public int vid; - public int pid; - public int fd; - public int busNum; - public int devNum; - public String usbFsName; - public void print(){ - Log.e(TAG, "vid=" + vid + ". pid=" + pid + ". fd=" + fd + ". busnum=" + busNum + ". devNum=" + devNum + ". usbFsName=" + usbFsName); + private void doUnbindService() { + if(mBounded){ + gLogger.debug("doUnbindService"); + unbindService(mConnection); + mBounded = false; } - }*/ - - //SurfaceTexture st = new SurfaceTexture(0); - - /*private static final String ACTION_USB_PERMISSION = - "com.android.example.USB_PERMISSION"; - private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { - - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (ACTION_USB_PERMISSION.equals(action)) { - synchronized (this) { - UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); - - if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) { - if(device != null){ - Log.e(TAG, "extra permission granted"); - //call method to set up device communication - - - new Thread(new Runnable() { - @Override - public void run() { - Log.e("device","MyThread3");//bhw - UsbDeviceConnection connection = usbManager.openDevice(usbCamera); - int fd = connection.getFileDescriptor();//获取文件描述符 - uData.fd = fd; - //ffmpeg.test(fd); - int ret = uvcCamera.open(uData.vid, uData.pid, uData.fd, uData.busNum, uData.devNum, uData.usbFsName); - Log.e(TAG, "uvcCamera open return code:" + ret); - - Log.e("device","MyThread3 "+fd); - } - }).start(); - - } - } - else { - Log.e(TAG, "permission denied for device. " + device); - } - } - } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){ - UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); - if (device != null){ - Log.e(TAG, "==== device out"); - } - } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { - Log.e(TAG, "==== device in ====="); - } - } - };*/ + } + @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(); - gLogger.debug("OnPause"); + gLogger.error("OnPause --------->"); } @Override protected void onResume() { super.onResume(); - gLogger.debug("OnResume"); + gLogger.error("OnResume ---------> "); } @Override protected void onStop() { super.onStop(); - gLogger.debug("onStop"); + gLogger.debug("onStop --------->"); } @Override protected void onStart(){ super.onStart(); - gLogger.debug("onStart"); + gLogger.debug("onStart --------->"); } @Override protected void onDestroy(){ super.onDestroy(); - gLogger.debug("onDestroy"); + unregisterReceiver(networkMonitor); + gLogger.debug("onDestroy --------->"); } @Override protected void onRestart(){ - super.onStart(); - gLogger.debug("onRestart"); + super.onRestart(); + gLogger.debug("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; - } - } - - - - // SurfaceHolder.Callback implementation @Override public void surfaceCreated(final SurfaceHolder holder){ @@ -340,99 +278,22 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal @Override public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){ gLogger.error("surfaceChanged"); - try { - mCamera.setPreviewDisplay(holder); - mCamera.startPreview(); - } catch (Exception e){ - gLogger.error("Error starting camera previewe: " + e.getMessage()); - Toast.makeText(this, "Camera Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); + 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"); } @Override public void onPreviewFrame(final byte[] data, Camera camera){ gLogger.error("onPreviewFrame"); - 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); - - -// ong 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 - 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); - } private String getMacAddr() { WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); @@ -442,11 +303,12 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal private void loadConfig() { UserInfo info = UserInfo.getConfig(); - mTextServer.setText(info.server.equals("") ? "rtmp://gpussh.suanzi.ai:1935/myapp" : info.server); - mTextUser.setText(info.user.equals("") ? "suanzi" : info.user ); - mTextCamera.setText(info.cameraId.equals("") ? "001" : info.cameraId); - mMacAddr = info.macAddr.equals("") ? this.mMacAddr : info.macAddr; - gLogger.debug("loadConfig " + info.toString()); + 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 void saveConfig() { @@ -457,27 +319,103 @@ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal } else { Toast.makeText(getApplicationContext(), "Error: config saved", Toast.LENGTH_LONG).show(); } - gLogger.error("saveConfig: " + info.toString()); + gLogger.error("saveConfig - url: " + info.toUrl(mMacAddr)); } - 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); + private boolean canStartService(){ + //gLogger.debug("canStartService - Camera: " + mUsbMonitor.hasUsbCamera() + ". Network: " + NetworkMonitor.isNetworkAvailable()); + return mUsbMonitor.hasUsbCamera() && NetworkMonitor.isNetworkAvailable(this); + } - 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(); + // MyServiceEventListener + @Override + public void onCameraError(String msg){ + gLogger.error("onCameraEvent " + msg); + } + @Override + public void onEncoderError(String msg){ + gLogger.error("onEncoderEvent: " + msg); + } - }catch (Exception e){ - e.printStackTrace(); - } + @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); +// } }