1 package ai.suanzi.rtmpclient;
3 import android.app.Service;
4 import android.content.Intent;
5 import android.graphics.SurfaceTexture;
6 import android.hardware.Camera;
7 import android.os.Handler;
8 import android.os.HandlerThread;
9 import android.os.IBinder;
10 import android.os.Looper;
11 import android.util.Log;
12 import android.view.SurfaceHolder;
13 import android.view.SurfaceView;
14 import android.view.WindowManager;
15 import android.widget.Toast;
16 import android.support.v4.app.NotificationCompat;
17 import android.graphics.BitmapFactory;
18 import android.app.Notification;
19 import android.os.Message;
20 import org.apache.log4j.Level;
21 import org.apache.log4j.Logger;
22 import android.hardware.Camera.PreviewCallback;
23 import android.os.IBinder;
24 import android.os.Binder;
25 import android.content.Context;
26 import android.graphics.PixelFormat;
27 import java.io.IOException;
28 import android.view.Gravity;
30 public class MyService extends Service implements Camera.PreviewCallback {
32 private Logger gLogger = Logger.getLogger("MyService");
34 private Ffmpeg ffmpeg = Ffmpeg.getInstance();
35 private Boolean isRunning = false;
36 private FfmpegRunnable runnable;
37 private Camera mCamera = null;
38 IBinder mBinder = new LocalBinder();
39 private WindowManager mWindowManager;
40 private SurfaceView mOutComeVideoView;
43 public class LocalBinder extends Binder {
44 public MyService getServiceInstance(){
45 return MyService.this;
49 private class FfmpegRunnable implements Runnable {
51 private Camera.PreviewCallback cb;
52 public FfmpegRunnable(String _url, Camera.PreviewCallback _cb){
58 gLogger.error("Run Ffmpeg url: " + url);
60 //ffmpeg.push(null, this.url);
61 if (mCamera == null) {
62 gLogger.error("open camea");
64 mCamera = Camera.open(1);
70 SurfaceTexture st = new SurfaceTexture(0);
72 mCamera.setPreviewTexture(st);
76 gLogger.error("start preview");
77 mCamera.setPreviewCallback(this.cb);
78 mCamera.startPreview();
83 private static final int NOTIFICATION_DOWNLOAD_PROGRESS_ID = 0x0001; //id不可设置为0,否则不能设置为前台service
84 private void createNotification(){
85 gLogger.error("createNotification");
86 NotificationCompat.Builder builder=new NotificationCompat.Builder(this); //使用兼容版本
87 builder.setSmallIcon(R.mipmap.ic_launcher); //设置状态栏的通知图标
88 builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background)); //设置通知栏横条的图标
89 builder.setAutoCancel(false); //禁止用户点击删除按钮删除
90 builder.setOngoing(true); //禁止滑动删除
91 builder.setShowWhen(true); //右上角的时间显示
92 builder.setContentTitle("Rtmp Foreground Service!!!"); //设置通知栏的标题内容
93 Notification notification = builder.build(); //创建通知
94 startForeground(NOTIFICATION_DOWNLOAD_PROGRESS_ID,notification); //设置为前台服务
98 public IBinder onBind(Intent intent) {
103 public void onCreate() {
105 gLogger.error("onCreate");
108 // mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
109 // mOutComeVideoView = new SurfaceView(this);
112 // WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(1, 1, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
113 // WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
114 // layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
115 // mWindowManager.addView(mOutComeVideoView, layoutParams);
116 // mOutComeVideoView.getHolder().addCallback(this);
119 createNotification();
120 runnable = new FfmpegRunnable("xxxxxx", this);
121 new Thread(runnable).start();
129 public void onDestroy() {
130 stopForeground(true);
131 Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show();
132 gLogger.error( "onDestroy");
138 public void onStart(Intent intent, int startid){
139 super.onStart(intent, startid);
140 gLogger.error("onStart");
145 public int onStartCommand(Intent intent, int flags, int startId) {
146 String url = "hahahahhah"; //intent.getExtras().getString("url");
149 gLogger.error("onStartCommand: url is:" + url + ". isRunning: " + isRunning);
150 runnable = new FfmpegRunnable(url, this);
152 createNotification();
153 Toast.makeText(this, "Video stream pushed to " + url, Toast.LENGTH_LONG).show();
154 new Thread(runnable).start();
160 public void onLowMemory(){
162 gLogger.error("onLowMemory");
165 // Camera.PreviewCallback
167 public void onPreviewFrame(final byte[] data, Camera camera){
168 gLogger.error("onPreviewFrame");
169 ffmpeg.process(data);
172 public void onChange (SurfaceHolder holder){
173 gLogger.error("onChange");
176 gLogger.error("xxxx holder is null xxxxxx");
178 if (mCamera == null) {
179 gLogger.error("xxxx camera is null xxxx");
182 mCamera.setPreviewDisplay(holder);
183 mCamera.startPreview();
184 } catch (Exception e){
191 // // SurfaceHolder.Callback implementation
193 // public void surfaceCreated(final SurfaceHolder holder){
194 // gLogger.error("SurfacedCreated");
198 // public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
199 // gLogger.error("surfaceChanged");
201 // mCamera.setPreviewDisplay(holder);
202 // } catch (Exception e){
203 // e.printStackTrace();
205 // mCamera.startPreview();
210 // public void surfaceDestroyed(SurfaceHolder holder){
211 // gLogger.error("surfaceDestroyed");