package com.mm.android.deviceaddmodule; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.text.TextUtils; import com.company.NetSDK.CB_fSDKLogCallBack; import com.company.NetSDK.DEVICE_NET_INFO_EX; import com.lechange.opensdk.media.DeviceInitInfo; import com.mm.android.deviceaddmodule.entity.DeviceNetInfo; import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager; import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil; import org.json.JSONException; import org.json.JSONObject; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 搜索局域网内设备信息的管理类 */ public class SearchDeviceManager { private static final String TAG = "SearchDeviceService"; private static volatile SearchDeviceManager sInstance; private volatile ConcurrentHashMap mDeviceNetInfos = new ConcurrentHashMap<>(); private SeachDeviceService.SearchDeviceBinder searchDevice; private ISearchDeviceListener mListener; boolean mIsConnected; //service是否已连接 volatile boolean mIsExist = false; private SearchDeviceManager() { mListener = new SearchDeviceImpl(); mDeviceNetInfos = new ConcurrentHashMap<>(); } public static SearchDeviceManager getInstance() { if (sInstance == null) { synchronized (SearchDeviceManager.class) { if (sInstance == null) { sInstance = new SearchDeviceManager(); } } } return sInstance; } public synchronized void connectService() { if(!mIsConnected){ Intent intent = new Intent(ProviderManager.getAppProvider().getAppContext(), SeachDeviceService.class); mIsConnected = ProviderManager.getAppProvider().getAppContext().bindService(intent, mBinderPoolConnection, Context.BIND_AUTO_CREATE); } if(!mIsExist){ mIsExist = true; } } private ServiceConnection mBinderPoolConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { } @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { LogUtil.debugLog(TAG, "onServiceConnected"); searchDevice = (SeachDeviceService.SearchDeviceBinder) arg1; if (searchDevice != null) { try { searchDevice.linkToDeath(mBinderPoolDeathRecipient, 0); } catch (Exception e) { e.printStackTrace(); } } registerListener(mListener); startSearch(); } }; private IBinder.DeathRecipient mBinderPoolDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { LogUtil.debugLog(TAG, "binderDied"); if (searchDevice != null) { searchDevice.unlinkToDeath(mBinderPoolDeathRecipient, 0); searchDevice = null; } connectService(); } }; public void registerListener(ISearchDeviceListener listener) { if (searchDevice != null) { searchDevice.registerListener(listener); } } public void unRegisterListener(ISearchDeviceListener listener) { if (searchDevice != null) { searchDevice.unRegisterListener(listener); } } public void stopSearch() { if (searchDevice != null) { searchDevice.stopSearchDevices(); if(mIsConnected){ ProviderManager.getAppProvider().getAppContext().unbindService(mBinderPoolConnection); mIsConnected = false; } } } public synchronized DeviceInitInfo getDeviceNetInfo(String snCode) { if (TextUtils.isEmpty(snCode)) return null; if (mDeviceNetInfos != null&&mDeviceNetInfos.get(snCode)!=null&&mDeviceNetInfos.get(snCode).isValid()) { return mDeviceNetInfos.get(snCode).getDevNetInfoEx(); } return null; } /** * 搜索 */ public synchronized void startSearch() { removeInvalidDevice(); if (searchDevice != null) { connectService(); searchDevice.startSearchDevices(); } } public synchronized void clearDevice() { if (mDeviceNetInfos != null) { mDeviceNetInfos.clear(); LogUtil.debugLog(TAG, "clear"); } } /** * 列表中移除无效的设备信息 */ public synchronized void removeInvalidDevice() { if (mDeviceNetInfos != null) { LogUtil.debugLog(TAG, "removeInvalidDevice: " + mDeviceNetInfos); for (Map.Entry entry : mDeviceNetInfos.entrySet()) { if (entry.getValue() != null) { if (!entry.getValue().isValid()) { // 移除无效的DeviceNetInfo mDeviceNetInfos.remove(entry.getKey()); LogUtil.debugLog(TAG, "remove: " + entry.getKey()); } else { // 将标志位重置 entry.getValue().setValid(false); } } } LogUtil.debugLog(TAG, "removeInvalidDevice: " + mDeviceNetInfos); } } /** * 释放资源 */ public synchronized void checkSearchDeviceServiceDestory() { stopSearch(); unRegisterListener(mListener); clearDevice(); mIsExist = false; } public synchronized boolean checkSearchDeviceServiceIsExist() { return mIsExist; } private class SearchDeviceImpl implements ISearchDeviceListener { @Override public void onDeviceSearched(String sncode, DeviceInitInfo info) { if (mDeviceNetInfos != null) { DeviceNetInfo deviceNetInfo=new DeviceNetInfo(info); mDeviceNetInfos.put(sncode, deviceNetInfo); LogUtil.debugLog(TAG, "onDeviceSearched: " + mDeviceNetInfos); } } } public interface ISearchDeviceListener { void onDeviceSearched(String sncode, DeviceInitInfo info); } }