面向android设备之电视盒子

电视盒子中比较常见的一个难点总结如下:

1:判断是自启动还是与服务端测试

2:没有网络情况下,怎么在启动后通过adb shell设置静态IP

3:Net有线网络没有插入,怎么连接指定wifi后进行与服务端长连接

4:判断设备优盘和外置SDCard挂载情况

5:通过HDMI播放外置T卡的视频

1:判断是自启动还是与服务端测试

这里可以通过adb shell命令操作,在启动的Activity中判断是否有该值存在,有则为自启动检测

如下:adb shell am start -n com.dongzhou.stb/com.dongzhou.stb.ui.MainAcivity -e startup "labView"

然后在onCreate中判断代码:

Intent intent = getIntent();

if (intent != null) {

if (intent.hasExtra("startup")) {

if (intent.getStringExtra("startup").equals("labview")) {

// 不通信,自启动

return;

}

} else {

// 判断,如果有线网络为空,则链接wifi

}

3:Net有线网络没有插入,怎么连接指定wifi后进行与服务端长连接

首先判断设备中的有线网,3G网,和wifi的状态;

ConnectivityManager cManager = (ConnectivityManager) mContext

.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo[] aNetworkInfos = cManager.getAllNetworkInfo();

if (aNetworkInfos != null) {// 逐一查找状态为已连接的网络

for (int i = 0; i < aNetworkInfos.length; i++) {

bAvailable = aNetworkInfos[i].isAvailable();

bConnected = aNetworkInfos[i].isConnected();

strTypeName = aNetworkInfos[i].getTypeName();

Log.d(TAG, "Available=" + bAvailable + " ; Connected="

+ bConnected + "; Type=" + strTypeName);

}

}

NetworkInfo activeNetInfo = cManager.getActiveNetworkInfo();

if (activeNetInfo != null) {

Log.i(TAG, "ActiveNetwork Name=" + activeNetInfo.getTypeName()

+ " ; Type=" + activeNetInfo.getType() + " ; isAvailable="

+ activeNetInfo.isAvailable() + " ; Connected="

+ activeNetInfo.isConnected());

strRes = "NET=ENABLE;";

NetworkInfo networkInfo = cManager

.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {

strRes += "MOBLIE=OPNE;";

} else {

strRes += "MOBLIE=CLOSE;";

}

networkInfo = cManager

.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {

Log.d(TAG, "ActiveNetwork " + networkInfo.getTypeName());

strRes += "WIFI=OPNE;";

} else {

strRes += "WIFI=CLOSE;";

}

这时候如果有线网没有连接,则读取外置sdcard,获取wifi连接的地址

1:判断外置sdcard是否存在

public static final boolean hasSDCard() {

return Environment.getExternalStorageState().equals(

android.os.Environment.MEDIA_MOUNTED);

}

2:读取配置:

if (Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {

try {

FileInputStream inputStream = new FileInputStream(

path);

byte[] b = new byte[inputStream.available()];

inputStream.read(b);

String result = "";

result += new String(b);

JSONObject object = new JSONObject(result);

JSONObject jsonArray = new JSONObject(

object.getString("dzstb"));

String ssid = jsonArray.getString("wifi_ssid");

String pwd = jsonArray.getString("wifi_pwd");

3:连接指定wifi:

public boolean Connect(String SSID, String Password, int iType,

boolean bCloseOthers) {

WifiConfiguration wifiConfig = CreateWifiInfo(SSID, Password, iType);

if (wifiConfig == null) {

Log.d(AppEnv.TAG, "WIFI Config = null");

return false;

}

WifiConfiguration tmpConfig = IsExsits(SSID);

if (tmpConfig != null) {

Log.d(AppEnv.TAG, "WIFI Existed SSID and Remove " + tmpConfig.SSID);

if (mWifiManager.removeNetwork(tmpConfig.networkId)) {

Log.d(AppEnv.TAG, "WIFI Remove cfg OK");

} else {

Log.e(AppEnv.TAG, "WIFI Remove cfg fail");

}

}

int netID = mWifiManager.addNetwork(wifiConfig);

Log.d(AppEnv.TAG, "WIFI addNetwork netID = " + netID);

// 连接netId所指的WIFI网络,并是其他的网络都被禁用

boolean enabled = mWifiManager.enableNetwork(netID, bCloseOthers);

Log.d(AppEnv.TAG, "WIFI enableNetwork = " + enabled);

if (enabled) {

boolean connected = mWifiManager.reconnect();

Log.d(AppEnv.TAG, "WIFI reconnect = " + connected);

}

return enabled;

}

这里如果在长连接的通信状态,然后重新连接wifi后程序接收不到判断是否连接的状态,有点bug.

4:判断设备优盘和外置SDCard挂载情况

判断是否是优盘以及容量,这里会我们用shell命令来判断

U盘获取判断代码:

public String GetOtgResult(String strType, int num) {

String strLine = "";

String strTemp = "";

String strRes = "";

String resString = "";

if (strType.equalsIgnoreCase("sda")) {

int i = 0;

// 8 0 12563968 sda

FileReader file = null;

BufferedReader buff = null;

try {

file = new FileReader("/proc/partitions");

buff = new BufferedReader(file);

while ((strLine = buff.readLine()) != null) {

if (strLine.indexOf("sda") > 0) {

i++;

Log.d(TAG, strLine);

strTemp = strLine;

strTemp = (strTemp.trim()).replaceAll("\\s* |\t|\r|\n",

";");

String[] columns = strTemp.split("\\;");

if (columns[0].equals("")) {

return "Res=FAIL:ERR=NO_SDA;";

} else {

strRes += "U" + i + "Total="

+ (Integer.parseInt(columns[2])) / 1024

+ "MB;";

}

}

}

buff.close();

buff = null;

file.close();

file = null;

} catch (IOException e) {

e.printStackTrace();

try {

buff.close();

} catch (IOException e1) {

e1.printStackTrace();

}

buff = null;

try {

file.close();

} catch (IOException e1) {

e1.printStackTrace();

}

file = null;

return "Res=FAIL;NUM=0;";

}

// 8 0 12563968 sda

if (num <= i) {

resString = "Res=PASS;" + "NUM=" + i + ";" + strRes;

} else {

resString = "Res=FAIL;" + "NUM=" + i + ";" + strRes;

}

}

return resString;

SDCard获取判断:

public static String getAllStorage(Activity context, int count,

boolean iswrite) {

StorageManager storageManager = (StorageManager) context

.getSystemService(Context.STORAGE_SERVICE);

String strRes = "";

if (storageManager == null) {

Log.i(AppEnv.TAG, "Failed  to call StorageManager service");

// return "Res=FAIL";

}

String[] volumePaths = null;

Method methodGetVolumePaths = null;

try {

methodGetVolumePaths = storageManager.getClass().getMethod(

"getVolumePaths");

volumePaths = (String[]) methodGetVolumePaths

.invoke(storageManager);

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if (null == volumePaths) {

Log.e(AppEnv.TAG, "Failed to GetVolumePaths");

return "Res=FAIL;NUM=0;TF1WR=FAIL;";

}

String name = "";

DecimalFormat formatter = new DecimalFormat();

formatter.setGroupingSize(3);

int surecount = 0;

for (int i = 0; i < volumePaths.length; i++) {

if (volumePaths[i].startsWith("/mnt/extsd")) {

surecount++;

String path = volumePaths[i].toString();

StatFs sfs = new StatFs(path);

long blocSize = sfs.getBlockSize();

long totalBlocks = sfs.getBlockCount();

long availaBlock = sfs.getAvailableBlocks();

long lTotal = (totalBlocks * (blocSize / 1024)) / 1024;

long lAvail = (availaBlock * (blocSize / 1024)) / 1024;

strRes += ";SDTotal" + surecount + "="

+ (Integer.parseInt(lTotal + "")) / 1024 + "GB;";

Log.i(AppEnv.TAG, strRes);

} else if (volumePaths[i].startsWith("/storage/emulated/0")) {

surecount++;

String path = volumePaths[i].toString();

StatFs sfs = new StatFs(path);

long blocSize = sfs.getBlockSize();

long totalBlocks = sfs.getBlockCount();

long availaBlock = sfs.getAvailableBlocks();

long lTotal = (totalBlocks * (blocSize / 1024)) / 1024;

long lAvail = (availaBlock * (blocSize / 1024)) / 1024;

strRes += "SDTotal" + surecount + "="

+ (Integer.parseInt(lTotal + "")) / 1024 + "GB";

}

}

if (count > surecount) {

return "Res=FAIL;NUM=" + surecount + ";" + strRes;

} else {

return "Res=PASS;NUM=" + surecount + ";" + strRes;

}

}

5:通过HDMI播放外置T卡的视频

1:获取sdCard是否存在

2:判断hdmi接口是否有插入状态:(返回1为插入)

public static String getResultOfReadDev(String dev) {

String strInfo = "";

String info = "";

String line = "";

File file = new File(dev);

if (!file.exists()) {

return "Error: NO such file " + dev;

}

InputStream input = null;

BufferedReader stdout = null;

try {

input = new FileInputStream(dev);

} catch (FileNotFoundException e) {

e.printStackTrace();

return strInfo;

}

stdout = new BufferedReader(new InputStreamReader(input), 8 * 1024);

try {

while ((line = stdout.readLine()) != null) {

info += line + "\n";

}

stdout.close();

stdout = null;

input.close();

input = null;

} catch (IOException e) {

e.printStackTrace();

if (stdout != null) {

try {

stdout.close();

} catch (IOException e1) {

e1.printStackTrace();

}

stdout = null;

}

if (input != null) {

try {

input.close();

} catch (IOException e1) {

e1.printStackTrace();

}

input = null;

}

}

strInfo = info;

return strInfo;

}

3:通过VideoView播放

mVideo.setVideoURI(Uri.parse(getIntent().getStringExtra("filename")));//

另外的开机启动配置,可以在刚开机的时候,就去判断是否有有限连接,如果没有的话,通过shell配置静态IP

开机启动程序:


public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

String strAction = intent.getAction();

if (strAction.equals(Intent.ACTION_BOOT_COMPLETED)) {

//进入主界面

}



shell配置有线网需要获取root权限,这里没有做处理,默认就是连接wifi进行通信.


下面在补充下常用到的adb命令:

反编译app:

进入这个目录,d2j-dex2jar.bat  classes.dex 

生成jar后用这个打开即可

面向android设备之电视盒子_第1张图片

获取android界面并点击:


面向android设备之电视盒子_第2张图片

adb shell input tap 400 200       400(横坐标)200(纵坐标)


查看所有包名:

adb shell pm list package


push到内置sdcard:

adb push 路径 /sdcard/

判断某个界面是否在前台:

面向android设备之电视盒子_第3张图片

你可能感兴趣的:(面向android设备之电视盒子)