面向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

开机启动程序:

<users-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">

<receiver android:name=".Receiver">

<intent-filter>

<action android:name="android.intent.action.BOOT_COMPLETED"/>

<category android:name="android.intent.category.HOME"/>

</intent-filter>

</receiver>


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界面并点击:


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


查看所有包名:

adb shell pm list package


push到内置sdcard:

adb push 路径 /sdcard/

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容