package com.anyun.h264.service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import com.anyun.h264.IH264EncodeService; import com.anyun.h264.model.ResourceInfo; import java.util.List; /** * H264编码服务客户端 * 用于绑定服务并调用AIDL接口 * * 使用示例: *
 * // 创建客户端
 * H264EncodeServiceClient client = new H264EncodeServiceClient(context);
 * 
 * // 绑定服务
 * client.bindService();
 * 
 * // 等待服务绑定完成后,调用接口
 * // 开启文件编码(带配置参数)
 * String jsonConfig = "{\"width\":640,\"height\":480,\"framerate\":25}";
 * int result = client.controlEncode(0, jsonConfig);
 * 
 * // 开启网络推送(带配置参数)
 * String networkConfig = "{\"ip\":\"192.168.1.100\",\"port\":8888,\"width\":1280,\"height\":720,\"framerate\":30}";
 * result = client.controlEncode(2, networkConfig);
 * 
 * // 停止编码(不需要配置参数)
 * client.controlEncode(1, null);
 * 
 * // 获取资源列表
 * List resources = client.getResourceList("240101000000", "240101235959");
 * 
 * // 解绑服务
 * client.unbindService();
 * 
*/ public class H264EncodeServiceClient { private static final String TAG = "H264EncodeClient"; private Context context; private IH264EncodeService service; private boolean isBound = false; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { Log.d(TAG, "Service connected"); service = IH264EncodeService.Stub.asInterface(binder); isBound = true; // 可以在这里添加服务连接成功的回调 if (onServiceConnectedListener != null) { onServiceConnectedListener.onConnected(); } } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "Service disconnected"); service = null; isBound = false; // 可以在这里添加服务断开连接的回调 if (onServiceDisconnectedListener != null) { onServiceDisconnectedListener.onDisconnected(); } } }; // 服务连接回调接口 public interface OnServiceConnectedListener { void onConnected(); } public interface OnServiceDisconnectedListener { void onDisconnected(); } private OnServiceConnectedListener onServiceConnectedListener; private OnServiceDisconnectedListener onServiceDisconnectedListener; public H264EncodeServiceClient(Context context) { this.context = context.getApplicationContext(); } /** * 设置服务连接监听器 */ public void setOnServiceConnectedListener(OnServiceConnectedListener listener) { this.onServiceConnectedListener = listener; } /** * 设置服务断开连接监听器 */ public void setOnServiceDisconnectedListener(OnServiceDisconnectedListener listener) { this.onServiceDisconnectedListener = listener; } /** * 绑定服务 * @return 是否成功启动绑定 */ public boolean bindService() { if (isBound) { Log.w(TAG, "Service is already bound"); return true; } Intent intent = new Intent(); intent.setComponent(new ComponentName(context, "com.anyun.h264.H264EncodeService")); boolean result = context.bindService(intent, connection, Context.BIND_AUTO_CREATE); if (!result) { Log.e(TAG, "Failed to bind service"); } return result; } /** * 解绑服务 */ public void unbindService() { if (isBound) { context.unbindService(connection); isBound = false; service = null; Log.d(TAG, "Service unbound"); } } /** * 检查服务是否已绑定 */ public boolean isServiceBound() { return isBound && service != null; } /** * 控制H264编码 * @param action 操作类型:0-开启h264文件写入,1-停止h264编码并停止写入文件,2-开启网络推送h264(不写入文件),3-停止h264编码并停止网络推送 * @param jsonConfig JSON格式的配置参数,包含:ip(服务器IP)、port(服务器端口)、width(视频宽度)、height(视频高度)、framerate(帧率)、simPhone(SIM卡号) * 示例:{"ip":"192.168.1.100","port":8888,"width":640,"height":480,"framerate":25,"simPhone":"013120122580"} * 如果action为1或3(停止操作),此参数可为null * @return 0-成功,1-失败 */ public int controlEncode(int action, String jsonConfig) { if (!isServiceBound()) { Log.e(TAG, "Service is not bound"); return 1; // 失败 } try { int result = service.controlEncode(action, jsonConfig); Log.d(TAG, "controlEncode(" + action + ", " + jsonConfig + ") returned: " + result); return result; } catch (RemoteException e) { Log.e(TAG, "Error calling controlEncode", e); return 1; // 失败 } } /** * 控制H264编码(重载方法,兼容旧代码,使用null作为jsonConfig) * @param action 操作类型:0-开启h264文件写入,1-停止h264编码并停止写入文件,2-开启网络推送h264(不写入文件),3-停止h264编码并停止网络推送 * @return 0-成功,1-失败 * @deprecated 建议使用 controlEncode(int action, String jsonConfig) 方法,传入完整的配置参数 */ @Deprecated public int controlEncode(int action) { return controlEncode(action, null); } /** * 获取资源列表 * @param startTime 开始时间(格式:YYMMDDHHmmss,例如:240101000000) * @param endTime 结束时间(格式:YYMMDDHHmmss,例如:240101235959) * @return 资源列表,如果失败返回null */ public List getResourceList(String startTime, String endTime) { if (!isServiceBound()) { Log.e(TAG, "Service is not bound"); return null; } try { List result = service.getResourceList(startTime, endTime); Log.d(TAG, "getResourceList returned " + (result != null ? result.size() : 0) + " resources"); return result; } catch (RemoteException e) { Log.e(TAG, "Error calling getResourceList", e); return null; } } }