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;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
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.os.IBinder;
import android.net.ConnectivityManager;
-//"rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90_cameraid";
+//"rtmp://gpussh.suanzi.ai:1935/myapp/suanzi_ac83f34ead90";
-public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback, MyService.MyServiceEventListener{
+public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, 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 SurfaceHolder mHolder;
+ private SurfaceView mSufaceView;
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;
+ private ServiceHealthMonitor mServiceHealthMonitor;
+ private static final int INTERVAL = 3 * 60; // seconds
- boolean mBounded;
+ boolean mBounded = false;
MyService mServer;
Intent mIntent;
- // private ServiceReceiver mServiceReceiver;
-
private void configLog(){
try {
final LogConfigurator logConfigurator = new LogConfigurator();
if(mUsbMonitor.hasUsbCamera()){
doBindService();
}
-
}
}, this);
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkMonitor, filter);
+
+ mServiceHealthMonitor = new ServiceHealthMonitor(new ServiceHealthMonitor.Callback() {
+ @Override
+ public void onNotHealthy() {
+ gLogger.error("onNotHealthy, in " + INTERVAL + " seconds, the publishing may stopped or have error ");
+ doUnbindService();
+ doBindService();
+ //restartApplication();
+ }
+ });
+ mServiceHealthMonitor.setInterval(INTERVAL); // 5 minutes
}
if(mServer.setRtmpUrl(UserInfo.getConfig().toUrl(mMacAddr))){
mServer.startPreview(mHolder);
}
+
+
}
};
private void doBindService(){
+ gLogger.debug("doBindService");
if(!mBounded && canStartService()) {
- gLogger.debug("doBindService");
+ gLogger.debug("Start service --------->");
bindService(mIntent, mConnection, BIND_AUTO_CREATE);
}
}
private void doUnbindService() {
+ gLogger.debug("doUnbindService");
if(mBounded){
- gLogger.debug("doUnbindService");
+ gLogger.debug("Stop service <---------");
unbindService(mConnection);
mBounded = false;
}
gLogger.error("Current network is available");
doBindService();
} else {
- gLogger.error("Current network is NOT available");
+ gLogger.error("Current network NOT available or no USB Camera connected");
}
mBtnStart.setText("start");
gLogger.error("----------> onClick");
saveConfig();
doUnbindService();
+ doBindService();
}
});
+
+ if(!mServiceHealthMonitor.isAlive()) {
+ gLogger.debug("mServiceHealthMonitor start, interval " + INTERVAL);
+ mServiceHealthMonitor.start();
+ }
}
@Override
@Override
protected void onDestroy(){
super.onDestroy();
+ mUsbMonitor.unregisterReceiver();
unregisterReceiver(networkMonitor);
+ unbindService(mConnection);
gLogger.debug("onDestroy --------->");
}
gLogger.debug("onRestart ---------->");
}
+ @Override
+ public void onBackPressed() {
+ gLogger.error("onBackPressed --------->");
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ }
+
// SurfaceHolder.Callback implementation
@Override
public void surfaceCreated(final SurfaceHolder holder){
public void surfaceDestroyed(SurfaceHolder holder){ gLogger.debug("surfaceDestroyed");
}
- @Override
- public void onPreviewFrame(final byte[] data, Camera camera){
- gLogger.error("onPreviewFrame");
-
- }
-
-
private String getMacAddr() {
WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
}
private boolean canStartService(){
- //gLogger.debug("canStartService - Camera: " + mUsbMonitor.hasUsbCamera() + ". Network: " + NetworkMonitor.isNetworkAvailable());
return mUsbMonitor.hasUsbCamera() && NetworkMonitor.isNetworkAvailable(this);
}
@Override
public void onCameraError(String msg){
gLogger.error("onCameraEvent " + msg);
+ if(mUsbMonitor.hasUsbCamera()){
+ //mServer.reopenCamera();
+ }
}
@Override
public void onEncoderError(String msg){
- gLogger.error("onEncoderEvent: " + msg);
+ gLogger.error("onEncoderError: " + msg);
+ doUnbindService();
+ doBindService();
}
@Override
- public void onIsPreviewing(String msg){
- gLogger.error("onIsPreviewing: " + msg);
+ public void onPublishing(String msg){
+ mServiceHealthMonitor.record();
}
-
-// 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);
-// }
+ private void restartApplication() {
+ final Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ }
}