• [开发资源] Android 媒体SDK
    Android SDK于2010714通过评审发布(非商用发布),用于ISV集成。使用方法: 将“android-001.zip”名称更改为“android.zip.001”,“android-002.zip”名称更改为“android.zip.002”,“android.zip.003”名称更改为“android.zip.003”后解压。
  • [版本公告] 华为云会议V7.6.5版本新特性:智能客服全新上线,解决问题更高效!
    华为云会议V7.6.5版本新特性本月优化内容:会前1.新增智能客服,方便解决使用问题会中2.会中隐藏未开启视频画面,画面展示更美观(Windows)3.入会新增提示邀请与会者4.会中视频画面轻拨放大(移动端)会控平台5.支持被广播与被点名的用户观看指定画面订购6.网络研讨会支持按次订购一、新增智能客服,方便解决使用问题适用场景:当在使用时有一些使用问题需要快速找到解答PC端移动端二、会中隐藏未开启视频画面,画面显示更美观(Windows)适用场景:当在会议中所需展示画面想要保持美观和一致性,可以选择隐藏未开启视频的与会者,画面展示更统一美观三、入会新增提示邀请与会者适用场景:会议发起者在入会之后需要邀请其他与会者加入会议时,可以一键快速分享进行邀请四、会中视频画面轻拨放大(移动端)适用场景:当会中共享时,移动端显示屏幕过小不能清晰查看内容时五、支持被广播和被点名的用户观看指定画面适用场景:在一场正式会议中,当被点名和被广播时,所观看到的画面我们可以灵活选择,方便与主持人进行更好的互动六、网络研讨会支持按次订购适用场景:当公司开月度/年度大会等场景时,可以按次订购,操作灵活且性价比高
  • [问题求助] 【鲲鹏920 robox】【android 容器 opengles 2.0】编译的镜像是否支持opengl es 3.0
    环境:运行的服务端内核和编译android镜像都没有打exagear补丁在android容器中执行opengl es3.0编写的应用程序会失败,但是opengl es2.0的就可以正常运行。检测到android系统目前是opengl es 2.0的版本。请问robox是否可以支持opengl es 3.0?还有exagear补丁有适配完成吗?
  • [ARM原生] 求32位内核转码补丁【ExaGear ARM32-ARM64 for Android VM】
    我根据《鲲鹏 BoostKit ARM 原生使能套件》编译安卓模拟器,进行到文档 3.5.2 Android内核编译时提示合入32位转码内核部分的补丁。 a. 联系华为一线工程师获取补丁goldfish-4.4-dev.patch,获取路径如下:https:// support.huawei.com/enterprise/zh/kunpeng-computing/kunpengcomputing-media-pid-251431619/software/251882957。此下载已失效, 请问哪里可以下载?
  • [专题汇总] Android 安装包优化
    SVG 全称 Scalable Vector Graphics , 可缩放矢量图 ; 矢量图不会随着图像缩放 , 出现图像质量降低的情况 ;png , jpeg 等位图会随着图像缩放 , 出现模糊的情况 ;Android 中使用 SVG 矢量图 , 能极大的减少占用空间的大小 ;应用中使用的小图标 , 一般都使用 SVG 格式 ;Android 中生成 Vector 矢量图资源但是在 Android 中 , 不能直接使用标准的 SVG 文件 , 使用 Vector Assets 实现对 SVG 图片格式的支持 , Vector 矢量图也是 XML 文件 , 根节点必须是 <vector> , 并且内容格式也有一定的不同 ;SVG 图片的根节点是 <svg> ;Vector 资源的根节点是 <vector> ;在 Android Studio 中 , 右键点击 res 资源目录 , 选择 " New / Vector Asset " 选项 ,
  • [技术干货] HBuilder使用夜神模拟器调试Android应用
    打开HBuilder——工具——选项——HBuilder 将第三方安卓模拟器端口号改为62001即可如果是海马的话 改为26944
  • [技术干货] Android和IOS两个系统的手机APP安装测试
      安装测试  软件在不同操作系统(Android系统和IOS系统)上是否正常安装。  软件在不同版本的操作系统(如Android 5.0/Android 6.0/Android 7.0/Android8.0和iOS 9.0/iOS 10.0/iOS 11.0/iOS 12.0)上是否正常安装。  软件在不同的品牌手机(华为/三星/OPPO/VIVO等其他品牌手机)上是否正常安装。  卸载旧版本再安装(这个操作可以排插新版本的安装包是否丢失库,如果是覆盖安装的话会继续依赖旧库,导致问题发现不了)。  覆盖安装是否正常。  降级安装是否能成功。  磁盘空间不足时,是否可以正常安装,安装的现象是什么。  安装过程中是否可以手动取消。  安装过程中突然手机关机怎么处理。  卸载测试  按照手机自身的卸载流程卸载是否能正常卸载。  使用adb命令卸载是否可以卸载。  卸载过程中有没有异常提示。  卸载过程中突然关机是否卸载成功。  界面测试(UI)。  界面上的布局是否按照需求上设计。  界面内容是否符合文档需求,文字是否有乱码或者翻译问题。  图片、动画、边框、颜色、字体、背景、按钮、目录、菜单、弹框、列表等…  软件logo,颜色,名称。
  • [技术干货] 基于Android SQLite的升级详解
    做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:ALTER TABLE Subscription ADD COLUMN Activation BLOB;ALTER TABLE Subscription ADD COLUMN Key BLOB;另外,如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。1. 将表名改为临时表ALTER TABLE Subscription RENAME TO __temp__Subscription;2. 创建新表CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);3. 导入数据INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;4. 删除临时表DROP TABLE __temp__Subscription;通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。
  • [技术干货] Android 实现九宫格抽奖功能
    public class NineLuckPan extends View { private Paint mPaint; private ArrayList<RectF> mRects;//存储矩形的集合 private float mStrokWidth = 5;//矩形的描边宽度 private int mRectSize;//矩形的宽和高(矩形为正方形) private int[] mItemColor = {Color.GREEN, Color.YELLOW};//矩形的颜色  public NineLuckPan(Context context) {  this(context, null); }  public NineLuckPan(Context context, @Nullable AttributeSet attrs) {  this(context, attrs, 0); }  public NineLuckPan(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {  super(context, attrs, defStyleAttr);  init(); }  /**  * 初始化数据  */ private void init() {  mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  mPaint.setStyle(Paint.Style.FILL);  mPaint.setStrokeWidth(mStrokWidth);  mRects = new ArrayList<>(); }  @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {  super.onSizeChanged(w, h, oldw, oldh);  mRectSize = Math.min(w, h) / 3;//获取矩形的宽和高  mRects.clear();//当控件大小改变的时候清空数据  initRect();//重新加载矩形数据 }  /**  * 加载矩形数据  */ private void initRect() {  //加载前三个矩形  for (int x = 0; x < 3; x++) {   float left = x * mRectSize;   float top = 0;   float right = (x + 1) * mRectSize;   float bottom = mRectSize;   RectF rectF = new RectF(left, top, right, bottom);   mRects.add(rectF);  }  //加载第四个  mRects.add(new RectF(getWidth() - mRectSize, mRectSize, getWidth(), mRectSize * 2));  //加载第五~七个  for (int y = 3; y > 0; y--) {   float left = getWidth() - (4 - y) * mRectSize;   float top = mRectSize * 2;   float right = (y - 3) * mRectSize + getWidth();   float bottom = mRectSize * 3;   RectF rectF = new RectF(left, top, right, bottom);   mRects.add(rectF);  }  //加载第八个  mRects.add(new RectF(0, mRectSize, mRectSize, mRectSize * 2));  //加载第九个  mRects.add(new RectF(mRectSize, mRectSize, mRectSize * 2, mRectSize * 2)); }  @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  drawRects(canvas); }  /**  * 画矩形  *  * @param canvas  */ private void drawRects(Canvas canvas) {  for (int x = 0; x < mRects.size(); x++) {   RectF rectF = mRects.get(x);   if (x == 8) {//中心的矩形背景为白色    mPaint.setColor(Color.WHITE);    canvas.drawRect(rectF, mPaint);   } else {    mPaint.setColor(mItemColor[x % 2]);    canvas.drawRect(rectF, mPaint);   }  } }}
  • [技术干货] 你的测试用例中,是否包含App前后台切换
    你的测试用例中,是否包含App前后台切换App前后台切换是我们平时常用的一个操作,比如:按手机的home键将应用置于后台、直接按手机电源键关闭屏幕或者通过最近打开的应用列表切换应用等,由此,我们可以得出结论:当app置于前台时,它的页面对我们是可见的;当app置于后台时,它的页面对我们是不可见的。  无论对于Android还是IOS,app前后台切换的流程都很长,因为牵扯到应用生命周期的管理,因此在测试过程中,可以帮我们发现一些意外的惊喜。不知道在你的App测试用例中是否包含前后台切换?如果没有,那从现在开始,你一定要将它补充到测试用例中。  这篇文章,会带着大家了解Android和IOS在前后台切换过程中,都经历了什么。这样当你在测试过程中,碰到相关问题时,也能有章可循。  Android前后台切换原理  早期的Android只有Activity用来展示页面元素,直到2011年Android3.0推出了Fragment的概念,不过Fragment并没有立即被用起来,大部分的开发者还是用Activity写Android页面,个人感觉是到Android4.x之后,Fragment才更多的运用到工作中。不过Fragment并不能单独的存在,其必须依赖在某一个Activity上,所以到后来GitHub上出现了好多Activity+Fragment的基础框架,其核心思想是:一个BaseActivity+多个Fragment。BaseActivity主要用于管理Fragment的生命周期,而Fragment用于实现不同的页面。前后台切换思路整理  对于没有任何移动端开发经验的人来说,Android和IOS应该也不大理解其中的原理。所以我根据自己的经验,帮大家整理一些前后台切换的测试的思路及出发点,供大家参考:  因为有重复调用同一个方法的可能,所以开发可能会用到标志位(用于标识是否是第一次调用)等,因此可以验证如下点:  界面上的逻辑是否正确,比如:数据不一致。  界面展示是否正确,比如:某些按钮不应该展示,却展示了。  因为有可能新创建对象,所以需要关注是否有内存泄漏存在。  是否会造成异常的网络请求,比如重复请求同一接口。  在app将要置于后台时,会保存当前界面上的数据,等到app再次回到前台时,重新渲染:  验证前后台切换后,界面数据是否被清空。  另外界面数据展示是否正常。  其他  是否会出现crash。  是否会造成app的专项数据异常,比如:cpu、耗电量等。  总结  软件测试,其实一定程度上就是用探索性的思路,挖掘更不容易出现的"惊喜",因此,我觉得"App前后台"切换绝对是一个不错的探索思路。
  • [技术干货] Android批量插入数据到SQLite数据库的方法
    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。有时需要把一些数据内置到应用中,常用的有以下几种方式:1、使用db.execSQL(sql)这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入。public void inertOrUpdateDateBatch(List<String> sqls) { SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); try { for (String sql : sqls) { db.execSQL(sql); } // 设置事务标志为成功,当结束事务时就会提交事务 db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { // 结束事务 db.endTransaction(); db.close(); } } 2、使用db.insert("table_name", null, contentValues)这里是把要插入的数据封装到ContentValues类中,然后调用db.insert()方法执行插入。db.beginTransaction(); // 手动设置开始事务 for (ContentValues v : list) { db.insert("bus_line_station", null, v); } db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交 db.endTransaction(); // 处理完成 db.close() 3、使用InsertHelper类这个类在API 17中已经被废弃了InsertHelper ih = new InsertHelper(db, "bus_line_station"); db.beginTransaction(); final int directColumnIndex = ih.getColumnIndex("direct"); final int lineNameColumnIndex = ih.getColumnIndex("line_name"); final int snoColumnIndex = ih.getColumnIndex("sno"); final int stationNameColumnIndex = ih.getColumnIndex("station_name"); try { for (Station s : busLines) { ih.prepareForInsert(); ih.bind(directColumnIndex, s.direct); ih.bind(lineNameColumnIndex, s.lineName); ih.bind(snoColumnIndex, s.sno); ih.bind(stationNameColumnIndex, s.stationName); ih.execute(); } db.setTransactionSuccessful(); } finally { ih.close(); db.endTransaction(); db.close(); } 4、使用SQLiteStatement查看InsertHelper时,官方文档提示改类已经废弃,请使用SQLiteStatementString sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)"; SQLiteStatement stat = db.compileStatement(sql); db.beginTransaction(); for (Station line : busLines) { stat.bindLong(1, line.direct); stat.bindString(2, line.lineName); stat.bindLong(3, line.sno); stat.bindString(4, line.stationName); stat.executeInsert(); } db.setTransactionSuccessful(); db.endTransaction(); db.close(); 第三种方法需要的时间最短,鉴于该类已经在API17中废弃,所以第四种方法应该是最优的方法。
  • [技术干货] Android(twenty-one)
    网络编程Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式。在Android中原生http网络编程中有两种实现方式,一种是使用HttpURLConnection,另一种就是使用HttpClient。现在使用更广泛的是HttpURLConnection这两种实现方式的大体过程都是:Android客户端向服务器发出请求。服务端接收请求并响应。服务端返回数据给客户端。在Http通信中有POST和GET两种方式,其不同之处在于GET方式可以获得静态页面,同时可以将请求参数放在URL字符串后面,传递给服务器;而POST方式的参数则是放在Http请求中的。因此,无论你是用哪一种HTTP实现方式都需要明确所使用的请求方式。ttpURLConnection根据使用目的不同,在具体使用时会稍有区别。从Internet获取网页,即向URL发送请求,将网页以流的形式读回本地。从Internet获取文件,即利用HttpURLConnection对象从网络中获取文件数据。向Internet发送请求参数,即向服务器传递参数,即向服务器传递参数向Internet传送XML数据。(使用HTTP的的方式传输文件,一般文件大小在5M一下,HTTP通信方式不适合传输大文件,对大文件的传输最好使用Socket通信方式,以保证程序的稳定性。)
  • [应用实践] 【转载】实现一个图像分类应用,部署到端侧安卓APP
    实现一个图像分类应用实现一个图像分类应用示例程序结构配置MindSpore Lite依赖项下载及部署模型文件编写端侧推理代码运行依赖构建与运行概述选择模型转换模型部署应用示例程序详细说明概述我们推荐你从端侧Android图像分类demo入手,了解MindSpore Lite应用工程的构建、依赖项配置以及相关API的使用。本教程基于MindSpore团队提供的Android“端侧图像分类”示例程序,演示了端侧部署的流程。选择图像分类模型。将模型转换成MindSpore Lite模型格式。在端侧使用MindSpore Lite推理模型。详细说明如何在端侧利用MindSpore Lite C++ API(Android JNI)和MindSpore Lite图像分类模型完成端侧推理,实现对设备摄像头捕获的内容进行分类,并在APP图像预览界面中,显示出最可能的分类结果。你可以在这里找到Android图像分类模型和示例代码。选择模型MindSpore团队提供了一系列预置终端模型,你可以在应用程序中使用这些预置的终端模型。MindSpore Model Zoo中图像分类模型可在此下载。 同时,你也可以使用预置模型做迁移学习,以实现自己的图像分类任务。转换模型如果预置模型已经满足你要求,请跳过本章节。 如果你需要对MindSpore提供的模型进行重训,重训完成后,需要将模型导出为.mindir格式。然后使用MindSpore Lite模型转换工具将.mindir模型转换成.ms格式。以mobilenetv2模型为例,如下脚本将其转换为MindSpore Lite模型用于端侧推理。./converter_lite --fmk=MINDIR --modelFile=mobilenetv2.mindir --outputFile=mobilenetv2.ms部署应用接下来介绍如何构建和执行mindspore Lite端侧图像分类任务。运行依赖Android Studio >= 3.2 (推荐4.0以上版本)NDK 21.3CMake 3.10.2Android SDK >= 26JDK >= 1.8构建与运行在Android Studio中加载本示例源码,并安装相应的SDK(指定SDK版本后,由Android Studio自动安装)。启动Android Studio后,点击File->Settings->System Settings->Android SDK,勾选相应的SDK。如下图所示,勾选后,点击OK,Android Studio即可自动安装SDK。(可选)若安装时出现NDK版本问题,可手动下载相应的NDK版本(本示例代码使用的NDK版本为21.3),并在Project Structure的Android NDK location设置中指定NDK的位置。连接Android设备,运行图像分类应用程序。通过USB连接Android设备调试,点击Run 'app'即可在你的设备上运行本示例项目。Android Studio连接设备调试操作,可参考https://developer.android.com/studio/run/device?hl=zh-cn。手机需开启“USB调试模式”,Android Studio才能识别到手机。 华为手机一般在设置->系统和更新->开发人员选项->USB调试中打开“USB调试模式”。在Android设备上,点击“继续安装”,安装完即可查看到设备摄像头捕获的内容和推理结果。识别结果如下图所示。示例程序详细说明本端侧图像分类Android示例程序分为JAVA层和JNI层,其中,JAVA层主要通过Android Camera 2 API实现摄像头获取图像帧,以及相应的图像处理等功能;JNI层在Runtime中完成模型推理的过程。此处详细说明示例程序的JNI层实现,JAVA层运用Android Camera 2 API实现开启设备摄像头以及图像帧处理等功能,需读者具备一定的Android开发基础知识。示例程序结构app├── src/main│   ├── assets # 资源文件|   |   └── mobilenetv2.ms # 存放模型文件│   |│   ├── cpp # 模型加载和预测主要逻辑封装类|   |   ├── ..|   |   ├── mindspore-lite-1.0.0-minddata-arm64-cpu # MindSpore Lite版本|   |   ├── MindSporeNetnative.cpp # MindSpore调用相关的JNI方法│   |   └── MindSporeNetnative.h # 头文件|   |   └── MsNetWork.cpp # MindSpore接口封装│   |│   ├── java # java层应用代码│   │   └── com.mindspore.himindsporedemo│   │       ├── gallery.classify # 图像处理及MindSpore JNI调用相关实现│   │       │   └── ...│   │       └── widget # 开启摄像头及绘制相关实现│   │           └── ...│   │   │   ├── res # 存放Android相关的资源文件│   └── AndroidManifest.xml # Android配置文件│├── CMakeList.txt # cmake编译入口文件│├── build.gradle # 其他Android配置文件├── download.gradle # 工程依赖文件下载└── ...配置MindSpore Lite依赖项Android JNI层调用MindSpore C++ API时,需要相关库文件支持。可通过MindSpore Lite源码编译生成mindspore-lite-{version}-minddata-{os}-{device}.tar.gz库文件包并解压缩(包含libmindspore-lite.so库文件和相关头文件),在本例中需使用生成带图像预处理模块的编译命令。version:输出件版本号,与所编译的分支代码对应的版本一致。device:当前分为cpu(内置CPU算子)和gpu(内置CPU和GPU算子)。os:输出件应部署的操作系统。本示例中,build过程由app/download.gradle文件自动下载MindSpore Lite版本文件,并放置在app/src/main/cpp/目录下。注: 若自动下载失败,请手动下载相关库文件,解压后将其放在对应位置:mindspore-lite-1.0.0-minddata-arm64-cpu.tar.gz 下载链接android{    defaultConfig{        externalNativeBuild{            cmake{                arguments "-DANDROID_STL=c++_shared"            }        }        ndk{             abiFilters'armeabi-v7a', 'arm64-v8a'          }    }}在app/CMakeLists.txt文件中建立.so库文件链接,如下所示。# ============== Set MindSpore Dependencies. =============include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp)include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/third_party/flatbuffers/include)include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION})include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include)include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include/ir/dtype)include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/include/schema)add_library(mindspore-lite SHARED IMPORTED )add_library(minddata-lite SHARED IMPORTED )set_target_properties(mindspore-lite PROPERTIES IMPORTED_LOCATION        ${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/lib/libmindspore-lite.so)set_target_properties(minddata-lite PROPERTIES IMPORTED_LOCATION        ${CMAKE_SOURCE_DIR}/src/main/cpp/${MINDSPORELITE_VERSION}/lib/libminddata-lite.so)# --------------- MindSpore Lite set End. --------------------# Link target library.       target_link_libraries(    ...     # --- mindspore ---        minddata-lite        mindspore-lite    ...)下载及部署模型文件从MindSpore Model Hub中下载模型文件,本示例程序中使用的终端图像分类模型文件为mobilenetv2.ms,同样通过app/download.gradle脚本在APP构建时自动下载,并放置在app/src/main/assets工程目录下。注:若下载失败请手工下载模型文件,mobilenetv2.ms 下载链接编写端侧推理代码在JNI层调用MindSpore Lite C++ API实现端测推理。推理代码流程如下,完整代码请参见src/cpp/MindSporeNetnative.cpp。加载MindSpore Lite模型文件,构建上下文、会话以及用于推理的计算图。加载模型文件:创建并配置用于模型推理的上下文// Buffer is the model data passed in by the Java layerjlong bufferLen = env->GetDirectBufferCapacity(buffer);char *modelBuffer = CreateLocalModelBuffer(env, buffer);创建会话void **labelEnv = new void *;MSNetWork *labelNet = new MSNetWork;*labelEnv = labelNet;// Create context.mindspore::lite::Context *context = new mindspore::lite::Context;context->thread_num_ = num_thread;// Create the mindspore session.labelNet->CreateSessionMS(modelBuffer, bufferLen, context);delete (context);加载模型文件并构建用于推理的计算图void MSNetWork::CreateSessionMS(char* modelBuffer, size_t bufferLen, std::string name, mindspore::lite::Context* ctx){    CreateSession(modelBuffer, bufferLen, ctx);      session = mindspore::session::LiteSession::CreateSession(ctx);    auto model = mindspore::lite::Model::Import(modelBuffer, bufferLen);    int ret = session->CompileGraph(model);}将输入图片转换为传入MindSpore模型的Tensor格式。将待检测图片数据转换为输入MindSpore模型的Tensor。// Convert the Bitmap image passed in from the JAVA layer to Mat for OpenCV processing BitmapToMat(env, srcBitmap, matImageSrc);// Processing such as zooming the picture size.matImgPreprocessed = PreProcessImageData(matImageSrc);  ImgDims inputDims; inputDims.channel = matImgPreprocessed.channels();inputDims.width = matImgPreprocessed.cols;inputDims.height = matImgPreprocessed.rows;float *dataHWC = new float[inputDims.channel * inputDims.width * inputDims.height]// Copy the image data to be detected to the dataHWC array.// The dataHWC[image_size] array here is the intermediate variable of the input MindSpore model tensor.float *ptrTmp = reinterpret_cast<float *>(matImgPreprocessed.data);for(int i = 0; i < inputDims.channel * inputDims.width * inputDims.height; i++){   dataHWC[i] = ptrTmp[i];}// Assign dataHWC[image_size] to the input tensor variable.auto msInputs = mSession->GetInputs();auto inTensor = msInputs.front();memcpy(inTensor->MutableData(), dataHWC,    inputDims.channel * inputDims.width * inputDims.height * sizeof(float));delete[] (dataHWC);对输入数据进行处理。bool PreProcessImageData(const LiteMat &lite_mat_bgr, LiteMat *lite_norm_mat_ptr) {  bool ret = false;  LiteMat lite_mat_resize;  LiteMat &lite_norm_mat_cut = *lite_norm_mat_ptr;  ret = ResizeBilinear(lite_mat_bgr, lite_mat_resize, 256, 256);  if (!ret) {    MS_PRINT("ResizeBilinear error");    return false;  }  LiteMat lite_mat_convert_float;  ret = ConvertTo(lite_mat_resize, lite_mat_convert_float, 1.0 / 255.0);  if (!ret) {    MS_PRINT("ConvertTo error");    return false;  }  LiteMat lite_mat_cut;  ret = Crop(lite_mat_convert_float, lite_mat_cut, 16, 16, 224, 224);  if (!ret) {    MS_PRINT("Crop error");    return false;  }  float means[3] = {0.485, 0.456, 0.406};  float vars[3] = {1.0 / 0.229, 1.0 / 0.224, 1.0 / 0.225};  SubStractMeanNormalize(lite_mat_cut, lite_norm_mat_cut, means, vars);  return true;}对输入Tensor按照模型进行推理,获取输出Tensor,并进行后处理。图执行,端测推理。// After the model and image tensor data is loaded, run inference.auto status = mSession->RunGraph();获取输出数据。auto names = mSession->GetOutputTensorNames();std::unordered_map<std::string, mindspore::tensor::MSTensor *> msOutputs;for (const auto &name : names) {    auto temp_dat =mSession->GetOutputByTensorName(name);    msOutputs.insert(std::pair<std::string, mindspore::tensor::MSTensor *> {name, temp_dat});  }std::string retStr = ProcessRunnetResult(msOutputs, ret);输出数据的后续处理。std::string ProcessRunnetResult(std::unordered_map<std::string,        mindspore::tensor::MSTensor *> msOutputs, int runnetRet) {  std::unordered_map<std::string, mindspore::tensor::MSTensor *>::iterator iter;  iter = msOutputs.begin();  // The mobilenetv2.ms model output just one branch.  auto outputTensor = iter->second;  int tensorNum = outputTensor->ElementsNum();  // Get a pointer to the first score.  float *temp_scores = static_cast<float *>(outputTensor->MutableData());  float scores[RET_CATEGORY_SUM];  for (int i = 0; i < RET_CATEGORY_SUM; ++i) {     if (temp_scores[i] > 0.5) {      MS_PRINT("MindSpore scores[%d] : [%f]", i, temp_scores[i]);     }    scores[i] = temp_scores[i];  }  // Score for each category.  // Converted to text information that needs to be displayed in the APP.  std::string categoryScore = "";  for (int i = 0; i < RET_CATEGORY_SUM; ++i) {    categoryScore += labels_name_map[i];    categoryScore += ":";    std::string score_str = std::to_string(scores[i]);    categoryScore += score_str;    categoryScore += ";";  }  return categoryScore;}原文:https://gitee.com/mindspore/docs/blob/r1.0/tutorials/lite/source_zh_cn/quick_start/quick_start.md
  • 华为,迈出了摒弃 Android 的第一步
    鸿蒙 OS 的诞生,不是为了替代 Android,而是超越 Android,打造万物互联时代的下一代操作系统。华为消费者业务软件部总裁王成录在 16 日的鸿蒙 OS 手机开发者 Beta 版发布会上激动地说。自 2019 年对外发布以来,鸿蒙 OS 一直吸引着外界的目光。其中有支持,也不乏质疑。华为并不是第一个自研手机 OS 的国产企业,却被聚光灯照在身上最多。在面向开发者推出鸿蒙 OS 的手机 Beta 版之后,新浪科技获悉,明年一季度发布的华为 P50 将正式搭载鸿蒙 OS,明年华为手机以及其它自研设备也将全面升级鸿蒙 OS。不过,用户升级鸿蒙 OS 之后,手机将仍然能够兼容和运行 Android App,以留出过渡期。而等待鸿蒙 OS 生态成熟后,华为将全面向鸿蒙切换。兼容 Android  不同于 Android在发布会现场,新浪科技也见到了为演示鸿蒙 OS 特性而展出的已经升级鸿蒙 OS 的华为手机。从体验上来看,这款手机在操作习惯、界面设计等方面与目前华为基于 Android 开发的 EMUI 区别不大。并且在内置的华为应用商店中,也可以自由下载和运行 Android App。这也引发了一些网友争议:「是不是就是 Android 系统改个壳?」一位现场工作人员向新浪科技表示,演示机只是为了展示基于鸿蒙 OS 的分布式能力,未来正式版的鸿蒙 OS 在手机上肯定会有全新的界面设计。实际上,从华为相关技术专家以及现场展示的功能上来看,鸿蒙 OS 与 Android 系统确实有着诸多差异化。王成录认为,过去近 20 年基于手机的移动互联网生态发展迅速,但无论是手机的发货量还是移动 App 的数量,以及用户在手机上消耗的时间,从 2018 年开始就不再增长,甚至在近两年走向下降。这意味着基于手机的生态已经来到了一个临界点,他判断,未来是 IoT 的时代。但在 IoT 设备数量快速增长的同时,仍然面临很多问题。目前所有的应用生态几乎全部基于智能手机平台。智能手表、智能电视、车机等 IoT 设备的生态发展非常缓慢,「很多人家里面很可能都有几台音箱,但是这些音箱用了一周,最多两周可能就会被遗忘了。这背后的原因是音箱上的应用太少了,如果我们解决不了这个问题,IoT 的时代是不可能真正来临的。」在王成录看来,IoT 生态发展缓慢最核心的原因就是操作系统的高度碎片化。即使是同一家企业生产的 IoT 设备之间连接、配网、使用都非常困难,更不用说不同企业生产的不同 IoT 设备。每个 IoT 设备的系统不同、应用不同,开发者面临诸多困难,自然应用数量也就少得可怜。王成录多次对外强调,鸿蒙 OS 的诞生,不是为了替代Android,而是超越Android,打造万物互联时代的下一代操作系统。在现场展区,华为展示了智能家居、互动娱乐、泛终端社交购物、移动办公跨端接续、智慧教育、智慧出行、运动健康这七大鸿蒙 OS 的新应用场景。以泛终端社交购物为例,据京东零售产品总监王志强介绍,与 Android 版本相比,鸿蒙版本年的京东 App 可以解决诸多目前的购物痛点。比如在购物比价时,消费者不再需要频繁切换产品页面,可以将产品详情页直接流转至平板上,手机和平板可以同时对比不同的商品;在直播购物场景下,可以将直播流转至智慧屏上,手机则被释放出来;在拼单场景下,好友或者家人可以共享屏幕讨论商品,甚至共享购物车一起拼单凑满减,并且各自生成订单,各自结算付款。在移动办公方面,科大讯飞消费者事业群听见科技 CTO 苏文畅介绍,科大讯飞的录音笔搭载鸿蒙 OS 之后,手机一碰即用,无需下载 App;碰一碰还可以将录音文件快传至手机,甚至可以将实时转写跨设备流转,手机端的实时转写可以流转至智慧屏端实时显示。从现场演示的案例来看,鸿蒙 OS 确实推出了一些 Android 并未实现、或者实现起来颇为复杂的功能。并且与 Android 系统以手机为主相比,手机只是鸿蒙 OS 目标设备中的一部分,手机+IoT 设备在功能、交互等方面的互联互通,才是鸿蒙 OS 的核心目标所在。构建生态 迈出第一步王成录坦言,做一个操作系统,技术上不难,生态才是核心。生态涉及的广度、深度和复杂度远远超过所有的单个技术。另外,如果配合不上产业发展变现的机会,强做生态也非常难成功。发布的第二年,鸿蒙 OS 的落地仍然处于早期阶段。对于一个处于商业化前期的 OS 而言,要吸引企业和个人开发者投入人力、物力开发新应用,极为不易。以京东为例,要实现上述不同于 Android 版本的新功能,开发者需要基于鸿蒙 OS 的开发者工具单独开发一个版本,也即是说,虽然鸿蒙 OS 能兼容 Android App,但企业需要同时开发和维护 Android 版本和鸿蒙 OS 版本的 App。据京东零售产品总监王志强透露,在鸿蒙版本的京东 App 开发中,京东方面投入了包括项目团队、产品团队和研发团队在内的 26 人;华为方面也投入了 10 人以上的技术合作和支持团队。在王成录的演讲中,京东也被当做典型案例分享。他表示,有了鸿蒙 OS,京东购物的应用就可以有手机以外更多的设备入口,可以在冰箱上、电视上,甚至所有带屏、带音响、带触控的亿级设备上运行。这对于寻求增量用户和场景的京东而言,无疑具备巨大的吸引力。但华为也遇到了一些阻力,其中就有企业曾参与为鸿蒙 OS 开发 App,中途因为人力投入等原因又转而放弃。另外,生态的建设也非一日之功。在现场展示的互动娱乐案例中,华为与优酷联合开发了多项跨屏互动新功能。其中手机端可以在 150°范围内自由操控平板端的视频观看角度,不过这一方面需要专门制作这类片源,另外由于计算方式的差异,手机与智慧屏还未实现该功能,双方目前正在开展联合研究。为了激励企业和个人开发者加入,华为也推出了一系列措施。由于 IoT 设备品类繁多且操作系统不同,开发者需要为手机、平板、手表等不同设备重复开发应用,且不同尺寸屏幕的设计和交互适配困难。而华为此次提供了一系列构建全场景应用的完整框架和开发工具平台,帮助开发者实现了一次开发多端部署,分布式的 UI 框架也能够让应用布局自适应多种屏幕尺寸。华为还宣布启动鸿蒙 OS 开发者创新大赛,将通过 150 万元奖金、20 位专业导师指导激发更多创新应用诞生。根据华为方面公布的数据,目前已有京东、银联、优酷、科大讯飞等 120 多家企业开始基于鸿蒙 OS 进行开发;超过 10 万开发者已参与华为赋能活动,为鸿蒙 OS 生态建设做贡献;接下来,华为也将在上海、广州等地继续举办开发者日活动,向开发者分享鸿蒙 OS 开发技术和应用案例。鸿蒙 OS 手机 何时问世?虽然华为一直对外强调,鸿蒙 OS 是面向 IoT 设备而生。但在谷歌 GMS 持续断供之下,华为手机何时搭载鸿蒙 OS,成为外界关注的焦点。华为消费者业务软件部副总裁杨海松透露,按照目前的进度,明年所有华为自研设备都将升级鸿蒙 OS,消费者不需要购买新的设备体验鸿蒙系统。同时,明年华为也将发布基于鸿蒙 OS 的智能手机。新浪科技从知情人士处获悉,明年一季度华为手机将正式搭载鸿蒙 OS,华为 P50 上市时会全面搭载鸿蒙 OS。另外,明年华为手机搭载鸿蒙 OS 之后,会采用双架构,仍然兼容 Android App,但要体验鸿蒙 OS 差异化的分布式特色功能,就需要安装鸿蒙版本的 App。「可能会单独开设鸿蒙 OS 的应用专区,留一个过渡期,让开发者逐步迁移,也是照顾用户的使用体验」,该人士说,等待鸿蒙 OS 生态成熟后,华为将进行全面切换。不过,从华为展示的鸿蒙 OS 的新功能来看,单单手机端搭载鸿蒙 OS 远远不够,在更多 IoT 设备上应用鸿蒙 OS,这些功能才能在端到端之间实现。今年双 11,就有九阳、美的、老板电器的多款搭载鸿蒙 OS 的 IoT 设备开售。根据王成录公布的计划,鸿蒙 OS 明年要覆盖 40+主流品牌 1 亿台以上的设备。此前华为消费者业务 CEO 余承东也公布过鸿蒙 OS 的开源计划,将在 2021 年 4 月面向内存 128MB-4GB 的终端设备开源;2021 年 10 月以后将面向 4GB 以上所有设备开源。如果华为的计划顺利推进,可以预见的是,明年鸿蒙 OS 的生态也将迎来新的发展阶段。「我个人非常有信心,也希望把这个信心传递给中国所有移动互联网产业的从业人员。」王成录说,中国网络最好、IoT 模块制造能力全世界最强、应用创新全世界最强、从业者全世界最多、市场全世界最大,在未来 IoT 的时代,中国企业有望开创一个全新的世界。
  • [技术干货] 在鲲鹏云手机创建android模拟器后,如何进行调试呢?
    在鲲鹏服务器上使用android delete avd -n test_7android create avd --name test_7 --target android-24 --abi arm64-v8a --device "Nexus 4" --skin 720x1600  --forceemulator -avd  test_7 -skip-adb-auth  -no-window -cores 4 -writable-system -partition-size 16384  -verbose -gpu host -qemu  -enable-kvm -m 8192          -vnc  :86 创建云手机后,如何调试android 模拟器的代码