• [技术干货] 简单介绍屏幕适配(三种常用方案)
    简单介绍屏幕适配(三种常用方案)1、像素(px):含义:通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。简而言之,像素就是手机屏幕的最小构成单元。单位:px(pixel),1px = 1像素点 一般情况下UI设计师的设计图会以px作为统一的计量单位。2、分辨率:含义:手机在横向、纵向上的像素点数总和 一般描述成 宽*高 ,即横向像素点个数 * 纵向像素点个数(如1080 x 1920)。单位:px(pixel),1px = 1像素点3、屏幕尺寸(in):含义:手机对角线的物理尺寸单位 英寸(inch),一英寸大约2.54cm 常见的尺寸有4.7寸、5寸、5.5寸、6寸4、屏幕像素密度(dpi):含义:每英寸的像素点数。 例如每英寸内有160个像素点,则其像素密度为160dpi。单位:dpi(dots per inch)计算公式: 像素密度 = 像素 / 尺寸 (dpi = px / in)标准屏幕像素密度(mdpi): 每英寸长度上还有160个像素点(160dpi),即称为标准屏幕像素密度(mdpi)密度类型 代表的分辨率(px) 屏幕密度(dpi) 换算(px/dp) 比例 图片px低密度(ldpi) 240x320 120 1dp=0.75px 3 3636中密度(mdpi) 320x480 160 1dp=1px 4 4848高密度(hdpi) 480x800 240 1dp=1.5px 6 7272超高密度(xhdpi) 720x1280 320 1dp=2px 8 9696超超高密度(xxhdpi) 1080x1920 480 1dp=3px 12 144*144一.Autolayout 用法 鸿洋地址 https://blog.csdn.net/qq_37237245/article/details/781340101、将autolayout引入dependencies {compile project(’:autolayout’)}也可以直接dependencies {compile ‘com.zhy:autolayout:1.4.5’}2、标明设计稿尺寸在AndroidManifest3、使用时候有两种用法:一种是让你的Activity继承自AutoLayoutActivity.一般可以把你的基类继承AutoLayoutActivity如果你觉得这种对你的activity改变太大等等,,,那么,你可以将你的布局替换成LinearLayout -> AutoLinearLayoutRelativeLayout -> AutoRelativeLayoutFrameLayout -> AutoFrameLayout系统原有的属性都会保留。ps:几个注意事项1、可以多用margin,减少嵌套,因为不需要考虑适配问题,所以,可以直接margin固定距离尺寸等等,LinearLayout的weight也不需要,直接每个布局设置相同宽度即可。2、textview使用中发现很多问题,直接用px会出现高度不对问题。鸿洋这样解释:设计稿一般只会标识一个字体的大小,比如你设置textSize=”20px”,实际上TextView所占据的高度肯定大于20px,字的上下都会有一定的间隙,所以一定要灵活去写字体的高度,比如对于text上下的margin可以选择尽可能小一点。或者选择别的约束条件去定位(比如上例,选择了marginBottom)但是更简单的处理方式是,我们的字体尺寸可以继续用sp.3、在listview ,recycleview 或者一些布局我们无法转换为autoXXX的布局,我们想为子布局做适配的时候,我们需要用到同一个方法, AutoUtils.autoSize(convertView);我们可以实例化出来子布局,然后设置适配,那么这个子布局将会适配auto布局。对于ListView对于ListView这类控件的item,默认根局部写“px”进行适配是无效的,因为外层非AutoXXXLayout,而是ListView。但是,不用怕,一行代码就可以支持了:@Overridepublic View getView(int position, View convertView, ViewGroup parent){ViewHolder holder = null;if (convertView == null){holder = new ViewHolder();convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);convertView.setTag(holder);//对于listview,注意添加这一行,即可在item上使用高度AutoUtils.autoSize(convertView);} else{holder = (ViewHolder) convertView.getTag();}
  • [行业资讯] NFC天天用,但你知道原理吗?
    NFC作为近场通信(Near Field Communication)的英文简称,其可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别()及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现、电子票务、门禁、移动身份识别、防伪等应用。NFC中文名称中的“近场”是指临近电磁场的无线电波。 因为无线电波实际上就是电磁波,所以它遵循麦克斯韦方程,电场和磁场在从发射天线传播到接收天线的过程会一直交替进行能量转换,并在进行转换时相互增强,例如我们的手机所使用的无线电信号就是利用这种原理进行传播的,这种方法称作远场通信。而在电磁波10个波长以内,电场和磁场是相互独立的,这时的电场没有多大意义,但磁场却可以用于短距离通讯,我们称之为近场通信。NFC技术的应用在世界范围内受到了广泛关注,国内外的电信运营商、手机厂商等不同角色纷纷开展应用试点,一些国际性协会组织也积极进行标准化制定工作。据业内相关机构预测,基于近场通信技术的手机应用将会成为移动增值业务的下一个杀手级应用。NFC标准为了和非接触式智能卡兼容,规定了一种灵活的网关系统,具体分为三种工作模式:点对点通信模式、读写器模式和NFC卡模拟模式。1、点对点形式点对点模式,这种模式下两个NFC设备可以交换数据。例如多个具有NFC功能的数字相机、手机之间可以利用NFC技术进行无线互联,实现虚拟名片或数字相片等数据交换。针对点对点形式来讲,其关键指的是把两个均具有NFC功能的设 备进行连接,从而使点和点之间的数据传输得以实现。经过把点对点形式作为前提,让具备NFC功能的手机与计算机等相关设备,真正达成点对点的无线连接与数据传输,并且在后续的关联应用中,不仅可为本地应用,同时也可为网络应用。因此,点对点形式的应用,对于不同设备间的迅速蓝牙连接,及其通信数据传输方面有着十分重要的作用。2、读卡器模式读/写模式,这种模式下NFC设备作为非接触读写器使用。例如支持NFC的手机在与标签交互时扮演读写器的角色,开启NFC功能的手机可以读写支持NFC数据格式标准的标签。读卡器模式的NFC通信作为非接触读卡器使用,可以从展览信息电子标签、电影海报、广告页面等读取相关信息。读卡器模式的NFC手机可以从TAG中采集数据资源,按照一定的应用需求完成信息处理功能,有些应用功能可以直接在本地完成,有些需要与TD-LTE 等移动结合完成。基于读卡器模式的NFC应用领域包括广告读取、车票读取、电影院门票销售等,比如电影海报后面贴有TAG标签,此时用户就可以携带一个支持NFC协议的手机获取电影信息,也可以连接购买电影票。读卡器NFC模式还可以支持公交车站点信息、旅游景点地图信息的获取,提高人们旅游交通的便捷性。3、卡模拟形式模拟卡片模式,这种模式就是将具有NFC功能的设备模拟成一张标签或非接触卡,例如支持NFC的手机可以作为门禁卡、银行卡等而被读取。卡模拟形式关键指的是把具有NFC功能的设备进行模拟,使之变成非接触卡的模式,比如,银行卡与门禁卡等。这种形式关键应用于商场或者交通等非接触性移动支付当中,在具体应用过程中,用户仅需把自身的手机或者其他有关的电子设备贴近读卡器,同时输入相应密码则可使交易达成。针对卡模拟形式中的卡片来讲,其关键是经过和非接触读卡器的RF域实行供电处理,这样即便NFC设备无电也同样可以继续开展工作。另外,针对卡模拟形式的应用,还可经过在具备NFC功能的相关设备中采集数据,进而把数据传输至对应处理系统中做出有关处 理,并且,这种形式还可应用于禁系统与本地支付等各个方面。NFC与RFID的比较第一,工作模式不同。NFC是将点对点通信功能,读写器功能和非接触卡功能集成进一颗芯片,而RFID则有阅读器和标签两部分组成。NFC技术既可以读取也可以写入,而RFID只能实现信息的读取以及判定。第二,传输距离不同。NFC传输距离比RFID小的多,NFC 的传输距离只有10厘米,RFID的传输距离可以达到几米、甚至几十米。NFC是一种近距离的私密通信方式,相对于RFID来说NFC具有距离近、带宽高、能耗低、安全性高等特点。第三,应用领域不同。NFC更多的应用于消费类电子设领域,在门禁、公交、手机支付等领域发挥着巨大的作用;RFID则更擅长于长距离识别,更多的被应用在生产、物流、跟踪、资产管理上。NFC与蓝牙的比较NFC和蓝牙都是短程通信技术,相对于蓝牙很早就被集成到移动电话中并已经被普及,NFC最近几年才开始被集成进移动电话中,并且到目前为止只集成在少数移动电话中。第一,建立时间不同,NFC通信设置程序简单,通信建立时间很短,仅需0.1s左右;而蓝牙通信设置程序相对复杂,通信建立时间较长,大概需要6s。第二,传输距离不同,NFC传输距离只有10cm,而蓝牙传输距离可达10m。但NFC在传输功耗和安全性方面略优于蓝牙。第三,传输速度和工作频率不同,NFC工作频率为13.56MHz, 传输速度最大424 Kbit/s,而蓝牙工作频率为2.4GHz,传输速度可 达2.1 Mbit/s。NFC与红外的比较NFC和红外传输相比,传输距离相当,但比红外传输速度更快,NFC传输速度最大可达424 Kbit/s,而红外传输速度大概 100Kbit/s。建立时间NFC比红外略快,NFC建立时间为0.1s, 红外传输建立时间为0.5s。红外传输必须严格的对齐才能传输数据,且中间不能有障碍物,而NFC则没有这种限制;另外NFC比红外更安全可靠。
  • [技术干货] 华为云IOT的Android应用开发【详细教程】
    华为云IOT Android应用开发详细教程(Android Studio开发)第〇章    简介      大家好,上一期发布的教程叫大家如何利用华为云物联网平台提供的官方Java Demo去编写Java上位机程序,由于主要是用的是GET请求去查询设备影子和查询设备,之后接到了很多小伙伴私信咨询POST请求的实现,现在带着大家,写一个不基于官方Java Demo,而是完全参考于华为云帮助文档去写的一个Android应用,具体用到了POST请求获取鉴权的Token、设备命令下发,Get请求获取设备属性影子数据(依旧是用于解析属性)和查询设备(依旧是用于解析设备在线状态),先给大家看一下最终效果: 第一章    提前准备Android Studio IDE(模拟器可联网)华为云设备接入IOTDAMQTT.fx第二章    详细步骤    1. 新建工程   2. 新建一个类,实现我们需要的所有方法认证鉴权根据华为云官方提供的帮助文档,我们可以知道,在调用接口前,我们需要完成认证鉴权,我们本次教程采用的是Token认证(帮助文档参考链接:cid:link_0)       上图的最后一行,我们可以看到,官方给出了一个调用IAM用户Token(使用密码)的帮助信息              通过上述界面我们可以知道,该接口的URI以及需要准备的参数,大家可以仔细阅读,教程中我们直接查看页面中的示例:我们需要准备的参数有:  IAM用户所属帐号名、IAM用户名、IAM用户密码、项目名称所属然后我们将准备的参数填入上述的JSON数据体String postbody="{"+"\""+"auth"+"\""+": {"+"\""+"identity"+"\""+": {"+"\""+"methods"+"\""+": ["+"\""+"password"+"\""+"],"+"\""+"password"+"\""+": {"+"\""+"user"+"\""+":{"+"\""+"domain\": {\"name\": \"********\"},\"name\": \"********\",\"password\": \"********\"}}},\"scope\": {\"project\": {\"name\": \"cn-north-4\"}}}}"; String strurl="https://iam.cn-north-4.myhuaweicloud.com"+"/v3/auth/tokens?nocatalog=false";现在我们写一个获取token的方法:public static String gettoken() throws Exception { String postbody="{"+"\""+"auth"+"\""+": {"+"\""+"identity"+"\""+": {"+"\""+"methods"+"\""+": ["+"\""+"password"+"\""+"],"+"\""+"password"+"\""+": {"+"\""+"user"+"\""+":{"+"\""+"domain\": {\"name\": \"********\"},\"name\": \"********\",\"password\": \"********\"}}},\"scope\": {\"project\": {\"name\": \"cn-north-4\"}}}}"; String strurl="https://iam.cn-north-4.myhuaweicloud.com"+"/v3/auth/tokens?nocatalog=false"; URL url = new URL(strurl); HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); urlCon.addRequestProperty("Content-Type", "application/json;charset=utf8"); urlCon.setDoOutput(true); urlCon.setRequestMethod("POST"); urlCon.setUseCaches(false); urlCon.setInstanceFollowRedirects(true); urlCon.connect(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(urlCon.getOutputStream(),"UTF-8")); writer.write(postbody); writer.flush(); writer.close(); Map headers = urlCon.getHeaderFields(); Set<String> keys = headers.keySet(); for( String key : keys ){ String val = urlCon.getHeaderField(key); System.out.println(key+" "+val); } return null; }然后我们在主函数中调用一下public httpGetHuaweiIOT()throws Exception { gettoken(); }我们选择运行我们检查控制台的输出接口返回的响应消息头中“X-Subject-Token”就是需要获取的用户Token,此时我们可以修改一下函数,在函数最后加上这两行:String token = urlCon.getHeaderField("X-Subject-Token"); System.out.println("X-Subject-Token"+" : "+token);返回值null改为return token;我们再run一下此时我们的认证鉴权就完事了。(文章后面我们会修改类,把gettoken函数写在类的构造函数内调用)【延伸】现在的postbody参数时我们写死的,大家也可以把参数做成变量传递进去;由于我们获取的TOKEN是有24小时有效期的,大家也可以学着华为云提供的java Demo在获取token以后去生成token.text文件,当过期时再重新获取,否则直接读取token保存的数据,本教程不在次延伸扩展。接下来我们完成通过查询设备属性影子来获取设备属性信息。获取设备影子解析属性首先我们查看华为云官方提供的帮助文档(https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html)              我们需要的URI我们可以这么拼接URI【2023年9月18日更新:strurl中的http接入地址请在“设备接入”“总览”“接入信息”中查看,例如我的是“iotda.cn-north-4.myhuaweicloud.com”】String strurl="https://xxx_your_http_adddress_xxx"+"/v5/iot/%s/devices/%s/shadow"; String project_id="*********"; String device_id="*********"; strurl = String.format(strurl, project_id,device_id);//注意更换自己的HTTP接入地址需要注意的是,除了上述两个必备参数以外,我们的token在这就派上用场了写程序之前,我们先导入安装一个jackson-databind、jackson-core、jackson-annotations的jar,我用的是jackson-databind-2.8.1.jar、 jackson-core-2.8.1.jar 和jackson-annotations-2.8.1.jar (大家可在网站上搜索下载,或者在文章末尾下载)我们切换为Java的project目录,在app/libs中粘贴并载入jar包剩下的两个jar包也是这样操作,如下图所示然后我们在类头中引入我们用到的路径接下来我们编写获取设备影子数据函数:【2023年9月18日更新:strurl中的http接入地址请在“设备接入”“总览”“接入信息”中查看,例如我的是“iotda.cn-north-4.myhuaweicloud.com”】​public static String getdev() throws Exception { String strurl="https://xxx_your_http_address_xxxx"+"/v5/iot/%s/devices/%s/shadow"; String project_id="*********"; String device_id="********* "; strurl = String.format(strurl, project_id,device_id); String token=gettoken(); URL url = new URL(strurl); HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); urlCon.addRequestProperty("Content-Type", "application/json"); urlCon.addRequestProperty("X-Auth-Token",token); urlCon.connect(); InputStreamReader is = new InputStreamReader(urlCon.getInputStream()); BufferedReader bufferedReader = new BufferedReader(is); StringBuffer strBuffer = new StringBuffer(); String line = null; while ((line = bufferedReader.readLine()) != null) { strBuffer.append(line); } is.close(); urlCon.disconnect(); String result = strBuffer.toString(); System.out.println(result); return null; }主函数中run一下public static void main(String[] args)throws Exception { //gettoken(); getdevshadow(); }我们在控制台可以看到第一行是获取的token,第二行是我们得到的设备影子json数据大家可以在华为云设备接入IOTDA的控制台修改产品:我们检查一下我们需要的数据:在华为云控制台那可以看一下:为了清楚的查看,我们格式化一下:其中的“report”->”properties”内的数据为我们要解析的设备属性,我们在函数中加上下面几句进行提取比如我们获取temp属性String pro="temp"; ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readValue(result, JsonNode.class); JsonNode tempNode = jsonNode.get("shadow").get(0).get("reported").get("properties").get(pro); String attvaluestr = tempNode.asText(); System.out.println(pro+"=" + attvaluestr);运行一下为了方便调用,我们改造一下函数定义,给他添上参数,改为:public static String getdev(String pro) throws Exception{}主函数这么调用:getdev("temp"); getdev("humi"); getdev("light");我们跑一下: 为了能够调用,我们最后要把return null;改为return attvaluestr;查询设备在线状态同样我们查看华为云的帮助文档      我们可以得主要区别是 URI不同: "https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s; 解析的数据不同,我们还是在getdev函数中进行修改,再给他加一个参数,如public static String getdev(String mode,String pro) throws Exception { String strurl=""; if(mode.equals("shadow")) strurl="https://xxx_your_http_address_xxxx"+"/v5/iot/%s/devices/%s/shadow"; else if(mode.equals("status")) strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s"; //-----下面的程序不做变化 //-----省略 }主函数调用就改为:getdev("shadow","temp"); getdev("shadow","humi"); getdev("shadow","light");运行结果是一样的然后我们把最后的影子解析先注释掉://String pro="temp"; /*ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readValue(result, JsonNode.class); JsonNode tempNode = jsonNode.get("shadow").get(0).get("reported").get("properties").get(pro); String attvaluestr = tempNode.asText(); System.out.println(pro+"=" + attvaluestr);*/ //return attvaluestr;加上return null;然后主函数添加: getdev("status","");运行一下:   我们把最后的数据格式化一下 其中status是我们需要提取的,我们取消原来的注释,改造一下解析数据的代码ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readValue(result, JsonNode.class); if(mode=="shadow") { JsonNode tempNode = jsonNode.get("shadow").get(0).get("reported").get("properties").get(pro); String attvaluestr = tempNode.asText(); System.out.println(pro+"=" + attvaluestr); return attvaluestr; } if(mode=="status") { JsonNode statusNode = jsonNode.get("status"); String statusstr = statusNode.asText(); System.out.println("status = " + statusstr); return statusstr; } return "something is error ";我们运行一下:命令下发老样子,我们依旧查看华为云帮助文档我们得到的信息:URI为:strurl="https://xxx_your_http_address_xxxx"+"/v5/iot/%s/devices/%s/commands";消息体是:String body="{\"paras\":{\""+"*****"+"\""+":"+"*****"+"},\"service_id\":\"***** \",\"command_name\":\"*****\"}";我们写一下实现方法:public String setCom(String com,String value) throws Exception{ String strurl=""; strurl="https://iotda.cn-north-4.myhuaweicloud.com"+"/v5/iot/%s/devices/%s/commands"; String project_id="*****"; String device_id="*****"; strurl = String.format(strurl, project_id,device_id); URL url = new URL(strurl); HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); urlCon.addRequestProperty("Content-Type", "application/json"); String token=gettoken(); urlCon.addRequestProperty("X-Auth-Token",token); urlCon.setDoOutput(true); urlCon.setRequestMethod("POST"); urlCon.setUseCaches(false); urlCon.setInstanceFollowRedirects(true); urlCon.connect(); String body = "{\"paras\":{\""+com+"\""+":"+value+"},\"service_id\":\"*****\",\"command_name\":\"*****\"}"; BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(urlCon.getOutputStream(),"UTF-8")); writer.write(body); writer.flush(); writer.close(); InputStreamReader is = new InputStreamReader(urlCon.getInputStream()); BufferedReader bufferedReader = new BufferedReader(is); StringBuffer strBuffer = new StringBuffer(); String line = null; while ((line = bufferedReader.readLine()) != null) { strBuffer.append(line); } is.close(); urlCon.disconnect(); String result = strBuffer.toString(); System.out.println(result); return result; }在主函数调用一下setCom("led","1");我们在华为云控制台的设备那查看   我们可以发现命令是成功的,但还有一个错误代码,那是因为设备不在线或没有对命令进行处理响应,这个我们交给设备处理,不在此介绍 另外设备需要订阅topic: $oc/devices/{device_id}/sys/commands/request_id={request_id} 同样在控制台也可以看到数据: 最后我们可以看到这个token每次都要调用,其实是没必要的,我们在这里把放到构造函数里:String token=""; public huaweiIOT()throws Exception { token= gettoken(); }最后我们删除的getdev的static声明,getdev函数的String  token=gettoken();,删除main函数,现在我们的函数结构是:public class httpGetHuaweiIOT {String token=""; public httpGetHuaweiIOT()throws Exception { token=gettoken(); } public String getAtt(String att,String mode) throws Exception{} public String setCom(String com,String value) throws Exception{} 这样我们的核心功能就完成了,接下来是安卓界面与逻辑部分    3. MainActivity中调用方法我们在protected void onCreate(Bundle savedInstanceState) {}添加一个线程用于获取数据和命令下次测试Thread t = new Thread() { @Override public void run() { try { huaweiIOT hwiot=new huaweiIOT(); System.out.println("获取状态"); String str=""; str=hwiot.getdev("status",""); if(str.equals("ONLINE")) { str="设备在线"; } else if(str.equals("OFFLINE")) { str="设备离线"; } System.out.println("获取成功,状态:"+str); System.out.println("获取温度"); str=hwiot.getdev("shadow","temp"); System.out.println("获取成功,温度:"+str); str=hwiot.getdev("shadow","humi"); System.out.println("获取成功,湿度:"+str); str=hwiot.getdev("shadow","light"); System.out.println("获取成功,光照强度:"+str); } catch (Exception e) { e.printStackTrace(); System.out.println("获取失败:"+e.toString()); } } }; t.start();注意,在run app之前我们要加入联网的权限,我们打开AndroidManifest文件,在<application>前添加下述:<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"/>然后我们run一下app:最后就是就是创建界面显示与逻辑设计啦     5.结语      到这里大家已经学习到了华为云物联网平台Android应用开发的基础操作啦,本期教程就到这里啦,大家可以完成自己的华为云物联网平台的Android应用开发;      如果有需要上述参考工程或获取jar包的话,扫描下方二维码,或微信搜索公众号“IOT趣制作”,回复关键字“华为云安卓”,领取教程的实例Demo,然后在HuaweiIOT类文件中填写参数信息即可。
  • [问题求助] 【华为云手机】【robox】通过docker exec -it xxx /bin/bash 无法进入android容器内部
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【华为云手机】【robox】什么地方可以配置运行的android系统的CPU数,内存大小和存储大小呢?
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【华为云手机】【robox】能够使用自己编译的android9.0系统吗
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【华为云手机】【robox】已经拉起来android系统了,怎么配置上外网呢?
    【功能模块】【操作步骤&问题现象】1、2、疑问1.网络使用的是服务器的网络?  我已经共享外网给服务器了,但是内部的android应用并不能够访问外网(如百度页面)。疑问2.单台android,能够设置代理ip吗?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 在android studio 中使用api 程序挂掉了
    package com.example.huaweiyuntest;import androidx.appcompat.app.AppCompatActivity;import com.huaweicloud.sdk.core.auth.ICredential;import com.huaweicloud.sdk.core.auth.BasicCredentials;import com.huaweicloud.sdk.core.exception.ConnectionException;import com.huaweicloud.sdk.core.exception.RequestTimeoutException;import com.huaweicloud.sdk.core.exception.ServiceResponseException;import com.huaweicloud.sdk.iotda.v5.region.IoTDARegion;import com.huaweicloud.sdk.iotda.v5.*;import com.huaweicloud.sdk.iotda.v5.model.*;import android.os.Bundle;import android.util.Log;import android.view.View;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void myOnclick(View view) { String ak = "CEMQ56PYJETBXJM2KMSF"; String sk = "kBmn8QZwFljmovoLfxny3LumhdUG1fjjPLcTcFPE"; ICredential auth = new BasicCredentials() .withAk(ak) .withSk(sk); IoTDAClient client = IoTDAClient.newBuilder() .withCredential(auth) .withRegion(IoTDARegion.valueOf("cn-north-4")) .build(); ShowDeviceShadowRequest request = new ShowDeviceShadowRequest(); request.withDeviceId("6253d26220cfa22b94c5afc0_868411057061517"); try { ShowDeviceShadowResponse response = client.showDeviceShadow(request); Log.e("leo",response.toString()); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { e.printStackTrace(); } catch (ServiceResponseException e) { e.printStackTrace(); //System.out.println(e.getHttpStatusCode()); //System.out.println(e.getErrorCode()); // System.out.println(e.getErrorMsg()); } }}我加了这个网络权限访问<uses-permission android:name="android.permission.INTERNET"/> 还是没用啊
  • [问题求助] 关于应用侧开发问题
    小白,现在学校在让我做一个小项目,就是开发一个APP能从华为物联网云获取硬件上报的数据,然后用Android studio编写一个app将这些数据显示出来。我现在也按照文档上教程说的,下载了JAVA SDK,然后又把调试成功的API函数给写在了上面,在IDEA上也调试成功了。然后我就把它打包成jar给拷贝到我的Android studio项目的libs下面了。我现在想在android的主活动里调用这个类提取出数据,应该怎么实现啊?
  • [技术干货] Android修行手册-EditText属性以及光标和小键盘控制[转载]
    前提这是小空坚持写的Android新手向系列,欢迎品尝。大佬(×)新手(√)实践过程今天我们继续学习EditText-她是程序和用户进行交互极其重要的控件。所有的App关于输入和编辑内容基本都用的这个控件来进行处理,基于该控件又封装了搜索,登录,输入限制,聊天框,内容编辑等组件。EditText继承自TextView,所以拥有TextView的“全部”功能,让我们抓紧领略下EditText的神奇吧。在布局中我们先简单看下:<EditText android:layout_width="160dp" android:layout_height="wrap_content" android:textColor="#ff0000" android:hint="芝麻粒儿提醒请输入您的内容" />细心的你运行后一定发现,浅灰色内容默认显示,当输入真正内容的时候就自动消失了。没错,那是友好型提示文本。Android发展到现在,这已经是基操了。而且也不用我们多做什么逻辑,只需要一个属性即可实现【android:hint=""】,剩下的系统自动处理,很方便。属性介绍上面也说了该控件继承自TextView,所以属性操作和TextView一致,关于TextView都有哪些属性,可以去看小空关于TextView的介绍,里面列举说明了基本所有属性。我们在此讲一些常用属性。android:textStyle=“bold” :设置文本样式,bold(粗体), italic(斜体), bold|italic(粗斜体)android:textColorHighlight="":设置选中文本的颜色android:textScaleX="1.5":设置水平方向字与字之间的间距android:textScaleY="1.5":设置垂直方向字与字之间的间距android:typeface="monospace" :设置文本的字体,monospace:等宽字体,sans:无衬线字体,serif:衬线,normal:普通字体。android:textColorHint="":设置提示文本Hint的文本颜色android:selectAllOnFocus:设置输入框获取焦点后是否选中所有文本,当为true的时候选中所有文本,默认为false。输入类型限制是很常用的了,比如仅仅显示数字,或者密码类型,也能减少bug产出。重点声明:以下属性针对Android原生系统和输入法是都支持的,针对国内系统和三方输入法有些属性是失效的。所以小空在这只列举常用的属性,小心别进坑了。android:inputType="none":EditText无限制,可以任意输入android:inputType="text":任何文本,等同于noneandroid:inputType="textMultiLine":多行输入,该属性会导致android:imeOptions属性失效android:inputType="textUri":网址类型android:inputType="textEmailAddress":电子邮件类型android:inputType="textPersonName":人名类型android:inputType="textPostalAddress":地址类型android:inputType="textPassword":密码类型android:inputType="textVisiblePassword":可见密码类型android:inputType="textWebEditText":网页变淡文本android:inputType="number":数字类型android:inputType="numberSigned": 带符号数字格式android:inputType=“numberDecimal” :带小数点的浮点格式android:inputType=“phone” :拨号键盘类型android:inputType=“datetime” :时间日期类型android:inputType=“date” :日期键盘类型android:inputType="time" :时间键盘类型android:digits="0123456789":设置只能显示哪些字符,如果内容较多不适用输入的时候控制键盘(回车键/确认键)的不同行为,该属性同上面一样,针对官方的输入法适用,但国内有很多不同的三方输入法,不一定有效,不过自定义键盘的时候会用到。android:imeOptions=“flagNoExtractUi” :使软键盘不全屏显示,只占用一部分屏幕 同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键android:imeOptions=“actionNone” :输入框右侧不带任何提示android:imeOptions=“actionGo” :右下角按键内容为’开始’android:imeOptions=“actionSearch” :右下角按键为放大镜图片,搜索android:imeOptions="actionSend":右下角按键内容为’发送’字样android:imeOptions=“actionNext” :右下角按键内容为’下一步’ 或’下一项’ 字样android:imeOptions=“actionDone” :右下角按键内容为’完成’字样小键盘控制一旦涉及输入框,那么小键盘一定少不了,在业务开发的过程中会针对小键盘隐藏显示等做出对应的措施,或者自定义键盘的业务功能都需要该技术。在AndroidMinifest.xml的【activity】中设置属性【windowSoftInputMode】即可。stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置,也就是小键盘的默认值,当输入组件EditText获取焦点的时候才会弹出stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示,举例,该页面A是隐藏键盘,跳转页面B后,键盘也是隐藏的。stateHidden:用户选择activity时,软键盘总是被隐藏stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的stateVisible:软键盘通常是可见的stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态,不管有没有输入框。adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示,并且会调整布局进而使输入内容始终可见adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间adjustPan:当前窗口的内容将自动移动以便当前焦点控件不被键盘覆盖和用户能总是看到输入内容的部分。上面的属性使用过程中同样不是唯一性,可联合使用。android:windowSoftInputMode=“adjustResize|stateAlwaysHidden”光标默认光标位置是在最后显示的,这也是对用户较好的体验形式。但同时官方仍然给了我们更多的自由空间。明文密文很多App业务中都需要密码输入,有的产品会在密码旁边有个【眼睛】的图标,展示可展示密码明文或回复密文。这都是程序中用代码控制的。EditText testEditText = findViewById(R.id.testEditText);//显示明文密码testEditText.setTransformationMethod(new HideReturnsTransformationMethod());//隐藏密码 就是密文显示 都是 *** 号testEditText.setTransformationMethod(new PasswordTransformationMethod());其他作者:小空和小芝中的小空转载说明-务必注明来源:https://zhima.blog.csdn.net/https://www.zhihu.com/people/zhimalierhttps://juejin.cn/user/4265760844943479这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气,日后定有一番大作为!!!旁边有点赞收藏今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
  • [问题求助] Android构建 脚本执行错误
    使用代码构建安卓代码一直发生这种情况
  • [行业资讯] 无法限制 Android ,只能禁用 GMS 服务
    “停止授权 GMS 服务”,这个关键词听起来是不是有些耳熟?不错,早在 2019 年,谷歌就对华为用过这一招了。部分人对此可能感到不解:为什么谷歌不直接禁用 Android,而是选择禁用 GMS 服务?事实是,不是谷歌不想,而是不能。谷歌于 2005 年收购了持有 Android 系统的公司,而后与手机厂商、运营商等共同组建了开放手机联盟 OHA,并签订了一个 Apache 2.0 开源许可协议,即谷歌必须将 Android 系统的源代码开源,其他手机厂商也可对 Android 系统进行贡献。因此,虽然 Android 名义上属于谷歌,但实际上谷歌并不具备绝对控制权。GMS 服务则由谷歌自己研发、是完全属于谷歌私有化的产品,因此手机厂商想使用 GMS 服务需向谷歌申请认证并交费,而谷歌也有权利禁止指定厂商使用 GMS 服务。对许多国内用户而言,由于没有使用过 GMS 服务可能并不了解其重要性。简单来说,GMS 服务是一个国外 Android 系统牢牢绑定的生态架构,许多谷歌开发的程序、第三方的游戏、社交 App 等产品,都需要支持 GMS 服务才能安装。因此在 2019 年谷歌突然宣布 GMS 服务断供华为后,一度令华为海外版手机无法正常使用,给华为海外手机业务带来了不小的影响。所幸后来华为推出了 HMS 服务以替代 GMS,解决了谷歌断供的问题,HarmonyOS 自发布以来也受到了大量消费者的喜爱——据华为官方统计,截至 2021 年底,已有 2.2 亿台华为设备搭载 HarmonyOS。但这一次,谷歌 GMS 服务断供的不是一家企业,而是一个国家。转载于CSDN微信公众号
  • [问题求助] 【kunpeng920服务器】【AMDGPU功能】android通过mesa调用AMD wx5100渲染出现异常
    【功能模块】kunpeng920服务器通过AMDGPU渲染【操作步骤&问题现象】1、在鲲鹏920,上带AMD wx5100 GPU,android asop 调用 mesa-22.0.0 and mesa-21.1.6进行渲染。都出现异常。2、【截图信息】【日志信息】(可选,上传日志内容或者附件)03-18 11:55:52.415 14435 14435 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 03-18 11:55:52.415 14435 14435 F DEBUG : Build fingerprint: 'redroid/redroid_arm64_only/redroid_arm64_only:12/SQ1D.220205.004/eng.frank.20220305.064003:userdebug/test-keys' 03-18 11:55:52.415 14435 14435 F DEBUG : Revision: '0' 03-18 11:55:52.415 14435 14435 F DEBUG : ABI: 'arm64' 03-18 11:55:52.415 14435 14435 F DEBUG : Timestamp: 2022-03-18 11:55:52.156479216+0000 03-18 11:55:52.415 14435 14435 F DEBUG : Process uptime: 0s 03-18 11:55:52.415 14435 14435 F DEBUG : Cmdline: com.android.systemui 03-18 11:55:52.415 14435 14435 F DEBUG : pid: 14118, tid: 14429, name: GrallocUploadTh >>> com.android.systemui <<< 03-18 11:55:52.415 14435 14435 F DEBUG : uid: 10062 03-18 11:55:52.415 14435 14435 F DEBUG : signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0xefc1a6277000 03-18 11:55:52.415 14435 14435 F DEBUG : x0 0000efc1a6277000 x1 b400efc0af1ec250 x2 00000000000000e8 x3 0000efc1a6277000 03-18 11:55:52.415 14435 14435 F DEBUG : x4 b400efc0af1ec338 x5 0000efc1a62770e8 x6 0000000000000000 x7 0000000000000000 03-18 11:55:52.415 14435 14435 F DEBUG : x8 0000000000000001 x9 0000000000000000 x10 0000000000000004 x11 000000000000003e 03-18 11:55:52.415 14435 14435 F DEBUG : x12 0000000000000000 x13 0000000000000000 x14 b400efc0af1ec250 x15 0000000000000000 03-18 11:55:52.415 14435 14435 F DEBUG : x16 0000efbe6c198580 x17 0000efc190dd9c20 x18 0000efbe1d5d0000 x19 0000000000000100 03-18 11:55:52.415 14435 14435 F DEBUG : x20 0000efc1a6277000 x21 b400efc0af1ec250 x22 00000000000000e8 x23 000000000000003e 03-18 11:55:52.415 14435 14435 F DEBUG : x24 0000000000000001 x25 00000000000000e8 x26 00000000000000e8 x27 0000efc1a6277000 03-18 11:55:52.415 14435 14435 F DEBUG : x28 000000000000003a x29 0000efbe1e343420 03-18 11:55:52.415 14435 14435 F DEBUG : lr 0000efbe6b77d200 sp 0000efbe1e343410 pc 0000efc190dd9ba8 pst 0000000020000000 03-18 11:55:52.415 14435 14435 F DEBUG : backtrace: 03-18 11:55:52.415 14435 14435 F DEBUG : #00 pc 000000000004bba8 /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy+248) (BuildId: ba489d4985c0cf173209da67405662f9) 03-18 11:55:52.415 14435 14435 F DEBUG : #01 pc 00000000004c51fc /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #02 pc 00000000009d7dc4 /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #03 pc 0000000000a8bfc8 /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #04 pc 0000000000716e94 /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #05 pc 0000000000698a9c /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #06 pc 0000000000697f80 /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #07 pc 0000000000698138 /vendor/lib64/dri/libgallium_dri.so (BuildId: 836ba0e12074242913f46921674e5afb) 03-18 11:55:52.415 14435 14435 F DEBUG : #08 pc 0000000000505238 /system/lib64/libhwui.so (std::__1::__packaged_task_func<android::uirenderer::EGLUploader::onUploadHardwareBitmap(SkBitmap const&, android::uirenderer::FormatInfo const&, AHardwareBuffer*)::'lambda'(), std::__1::allocator<android::uirenderer::EGLUploader::onUploadHardwareBitmap(SkBitmap const&, android::uirenderer::FormatInfo const&, AHardwareBuffer*)::'lambda'()>, void* ()>::operator()()+120) (BuildId: 3d3592fb15b099f3bc3663e5c01ad8af) 03-18 11:55:52.415 14435 14435 F DEBUG : #09 pc 000000000020ef68 /system/lib64/libhwui.so (std::__1::__function::__func<decltype(fp()) android::uirenderer::WorkQueue::runSync<android::uirenderer::EGLUploader::onUploadHardwareBitmap(SkBitmap const&, android::uirenderer::FormatInfo const&, AHardwareBuffer*)::'lambda'()>(android::uirenderer::EGLUploader::onUploadHardwareBitmap(SkBitmap const&, android::uirenderer::FormatInfo const&, AHardwareBuffer*)::'lambda'()&&)::'lambda'(), std::__1::allocator<decltype(fp()) android::uirenderer::WorkQueue::runSync<android::uirenderer::EGLUploader::onUploadHardwareBitmap(SkBitmap const&, android::uirenderer::FormatInfo const&, AHardwareBuffer*)::'lambda'()>(android::uirenderer::EGLUploader::onUploadHardwareBitmap(SkBitmap const&, android::uirenderer::FormatInfo const&, AHardwareBuffer*)::'lambda'()&&)::'lambda'()>, void ()>::operator()()+88) (BuildId: 3d3592fb15b099f3bc3663e5c01ad8af) 03-18 11:55:52.415 14435 14435 F DEBUG : #10 pc 00000000003c62c8 /system/lib64/libhwui.so (android::uirenderer::WorkQueue::process()+156) (BuildId: 3d3592fb15b099f3bc3663e5c01ad8af) 03-18 11:55:52.415 14435 14435 F DEBUG : #11 pc 00000000004ebc7c /system/lib64/libhwui.so (android::uirenderer::ThreadBase::threadLoop()+72) (BuildId: 3d3592fb15b099f3bc3663e5c01ad8af) 03-18 11:55:52.415 14435 14435 F DEBUG : #12 pc 00000000000120ac /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+260) (BuildId: d5dfcc2a0782d6e050d6cf3448f6af45) 03-18 11:55:52.415 14435 14435 F DEBUG : #13 pc 0000000000011964 /system/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+404) (BuildId: d5dfcc2a0782d6e050d6cf3448f6af45) 03-18 11:55:52.415 14435 14435 F DEBUG : #14 pc 00000000000b1910 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9) 03-18 11:55:52.415 14435 14435 F DEBUG : #15 pc 00000000000513f0 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)
  • [ARM原生] 【转】Cuttlefish 虚拟 Android 设备
    什么是 Cuttlefish?Cuttlefish 是一种可配置的虚拟 Android 设备,既可以远程运行(使用第三方云产品,如 Google Cloud Engine),又可以在本地运行(在 Linux x86 机器上)。Cuttlefish 的目标使平台和应用开发者不再依赖于物理硬件来开发和验证代码更改。通过与核心框架保持高度一致,以高保真度为重点来复制真实设备的基于框架的行为。支持 API 级别 28 之后的所有 API 级别。在各个 API 级别达到一致的功能水平,与物理硬件上的行为保持一致。实现规模化:能够并行运行多台设备。能够并发执行测试,实现高保真度且入门成本较低。提供可配置的设备,能够调整设备类型、RAM、CPU 等。Cuttlefish 与其他设备的对比情况Cuttlefish 和 Android 模拟器Cuttlefish 与 Android 模拟器有许多相似之处,但 Cuttlefish 可以保证 Android 框架(无论这是纯 AOSP,还是您自己的树中的自定义实现)实现全保真。在实际应用中,这意味着 Cuttlefish 应该会在操作系统级别响应您的互动,就像使用相同的自定义或纯 Android 操作系统源代码构建的实体手机目标一样。Android 模拟器围绕简化应用开发的用例构建而成,它包含许多功能钩子来迎合 Android 应用开发者的用例。如果您要使用您的自定义 Android 框架来构建模拟器,这可能会带来一些挑战。如果您需要能够代表您的自定义平台/框架代码或 Android 树形结构的虚拟设备,那么 Cuttlefish 虚拟设备是理想的选择。它是用于表示当前 AOSP 开发状态的规范设备。Cuttlefish 和物理设备Cuttlefish 虚拟设备与物理设备之间的主要区别在于硬件抽象层 (HAL) 级别,以及与任何自定义硬件互动的任何软件。除了硬件专用实现之外,您应该会发现 Cuttlefish 和物理设备表现出在功能上等效的行为。Cuttlefish 有哪些益处?您可以像与任何可能用于调试的其他 Android 设备互动一样与 Cuttlefish 互动。它会通过 adb 将自身注册为正常设备,您可以像与物理设备互动一样通过远程桌面与之互动。Cuttlefish 的用例非常广泛,涵盖应用测试、自定义系统构建测试等。由于 Cuttlefish 力求实现框架全保真,因此可用于对您的框架和/或应用进行功能测试,在测试中没有无法模拟的物理硬件依赖项。目前 Cuttlefish 通常如何用于测试?Cuttlefish 在测试方面的一些常见应用包括:CTS框架合规性持续集成测试自定义测试套件我是否可以在云端托管 Cuttlefish?可以,Cuttlefish 本身支持 Google Cloud,并计划支持其他云平台。声明:        本文转自:https://source.android.google.cn/setup/create/cuttlefish,仅供学习与交流,非商业用途,版权归原作者所有,如有侵权,请联系删除。
  • [技术干货] Android中AIDL的工作原理
    IPC在这之前我们先简单说一下IPC,IPC是Inter-Process Communication的缩写,是进程间通信或者跨进程通信的意思,既然说到进程,大家要区分一下进程和线程,进程一般指的是一个执行单元,它拥有独立的地址空间,也就是一个应用或者一个程序。线程是CPU调度的最小单元,是进程中的一个执行部分或者说是执行体,两者之间是包含与被包含的关系。因为进程间的资源不能共享的,所以每个系统都有自己的IPC机制,Android是基于Linux内核的移动操作系统,但它并没有继承Linux的IPC机制,而是有着自己的一套IPC机制。BinderBinder就是Android中最具特色的IPC方式,AIDL其实就是通过Binder实现的,因为在我们定义好aidl文件后,studio就帮我们生成了相关的Binder类。事实上我们在使用AIDL时候继承的Stub类,就是studio帮我们生成的Binder类,所以我们可以通过查看studio生成的代码来了解Binder的工作原理。首先我们定义一个AIDL文件
总条数:181 到第
上滑加载中