关于android:刷脸认证如何实现人脸又快又准完成校验

互联网飞速发展的明天,各种App的验证办法也越来越不便用户,从一开始的明码输出,到起初的指纹解锁,演变成现在的刷脸认证。刷个脸,就能够解锁设施、在线/线下领取、通过门禁、疾速检票等。与此同时也随同了很多平安问题,首要就是如何判断用户的真实性。 HMS Core机器学习服务(ML Kit)的人脸比对和活体检测能力可能疾速捕获人脸,通过辨认并提取模板中的人脸特色,不须要用户配合做动作就能够判断是实在人脸,还是人脸攻打,同时将模板人像和人脸进行高精度比对,输入类似度值,进而判断两者是否为同一个人。 基于此,开发者能够疾速构建人脸检测能力,比方在金融类App中,比对用户身份证照片和人脸检测后果,判断用户信息真实性,可提供疾速平安的身份核验流程,实用于互联网近程开户、刷脸领取等金融业务。在办公App中,可采取刷脸考勤,辨认是否为自己,无效避免代打卡等行为。 成果展现 从成果展现图来看,活体检测几秒钟就能够实现精准辨认手机上的假照片。 开发步骤开发筹备在AppGallery Connect中配置相干信息,具体开发筹备能够参考文档。配置HMS Core SDK的Maven仓地址。关上Android Studio我的项目级“build.gradle”文件。 增加AppGallery Connect插件以及Maven代码库。 在“allprojects”>“repositories”外面配置HMS Core SDK的Maven仓地址。 allprojects { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }在“buildscript”>“repositories”外面配置HMS Core SDK的Maven仓地址。 buildscript { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }在“buildscript”>“dependencies”外面减少AppGallery Connect插件配置。 buildscript{ dependencies { classpath 'com.huawei.agconnect:agcp:1.3.1.300' } }人脸比对性能开发创建人脸比对检测器实例。MLFaceVerificationAnalyzer analyzer = MLFaceVerificationAnalyzerFactory.getInstance().getFaceVerificationAnalyzer();通过android.graphics.Bitmap创立MLFrame对象用于设置模版图片,反对的图片格式包含:JPG、JPEG、PNG、BMP。// 通过bitmap创立MLFrameMLFrame templateFrame = MLFrame.fromBitmap(bitmap);设置人脸比对模版图片。如果模板中无人脸,则示意模板设置失败,放弃该实例上一次设置的模板不变。List<MLFaceTemplateResult> results = analyzer.setTemplateFace(templateFrame);for (int i = 0; i < results.size(); i++) { // 解决模板图片辨认后果}通过android.graphics.Bitmap创立MLFrame对象用于设置比对图片。反对的图片格式包含:JPG、JPEG、PNG、BMP。// 通过bitmap创立MLFrameMLFrame compareFrame = MLFrame.fromBitmap(bitmap);调用同步或异步办法进行人脸比对。检测后果次要包含比对图片中检测到的人脸信息、检测到的人脸信息与模板人脸是同一个人的置信度。详细信息请参见MLFaceVerificationResult。• 异步办法示例代码: ...

June 9, 2022 · 1 min · jiezi

关于android:基于Linphone开发Android音视频通话

1,Linphone简介1.1 简介LinPhone是一个遵循GPL协定的开源网络电话或者IP语音电话(VOIP)零碎,其次要如下。应用linphone,开发者能够在互联网上随便的通信,包含语音、视频、即时文本音讯。linphone应用SIP协定,是一个规范的开源网络电话零碎,能将linphone与任何基于SIP的VoIP运营商连接起来,包含咱们本人开发的收费的基于SIP的Audio/Video服务器。 LinPhone是一款自由软件(或者开源软件),你能够随便的下载和在LinPhone的根底上二次开发。LinPhone是可用于Linux, Windows, MacOSX 桌面电脑以及Android, iPhone, Blackberry挪动设施。 学习LinPhone的源码,开源从以下几个局部着手: Java层框架实现的SIP三层协定架构: 传输层,事务层,语法编解码层; linphone动静库C源码实现的SIP性能: 注册,申请,申请超时,邀请会话,挂断电话,邀请视频,收发短信...linphone动静库C源码实现的音视频编解码性能;Android平台上的音视频捕捉,播放性能; 1.2 根本应用如果是Android零碎用户,能够从谷歌利用商店装置或者从这个链接下载Linphone 。装置实现后,点击左上角的菜单按钮,抉择进入助手界面。在助手界面,能够设定SIP账户或者Linphone账号,如下图: 对于咱们来说,就是设置SIP账户,须要填入几个参数: 用户名:就是SIP账户号码或名称。明码:该SIP账户对应的明码。域名:填写SIP服务器(IPPBX)的IP地址或域名。显示名:该SIP账户的显示名,是可选的。传输:该SIP服务器反对传输协定,个别是UDP,也能够依据须要抉择TCP或者TLS。注册胜利之后呢,软电话APP会有提示信息,左上角显示连贯状态,如下图。 而后,输出对方的SIP账户,就能够通话了,如下图。 1.3 相干文档上面是Linphone开发可能会用到的一些材料: Linphone官网 :http://www.linphone.org/technical-corner/liblinphone官网文档:https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Getting%20started/Android/官网Android Demo:https://gitlab.linphone.org/BC/public/linphone-android各个版本的aar库:https://linphone.org/releases/maven_repository/org/linphone/linphone-sdk-android/2,疾速上手2.1 编译App首先,应用 Android Studio关上我的项目,而后构建/装置应用程序即可,可能编译过程中会比较慢。当然,也能够应用命令形式进行编译: ./gradlew assembleDebug//或者./gradlew installDebug2.2 编译SDK在Android利用程序开发中,引入第三方库的形式有源码依赖和sdk依赖。当然,咱们也能够把sdk的代码下载下来,而后执行本地编译。 git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git --recursive而后装置官网文档的阐明编译sdk。 2.3 集成Linphone首先,须要引入linphone依赖,能够间接下载aar包执行本地以来,也能够应用gradle形式引入。此处,咱们应用他人曾经编译好的sdk: dependencies { //linphone debugImplementation "org.linphone:linphone-sdk-android-debug:5.0.0" releaseImplementation "org.linphone:linphone-sdk-android:5.0.0"}CoreManager为了不便调用,咱们须要对Linphone进行简略的封装。首先,依照官网文档的介绍,创立一个CoreManager类,此类是sdk外面的治理类,用来管制复电铃声和启动CoreService,无非凡需要不需调用。须要留神的是,启动复电铃声须要导入media包,否则不会有复电铃声,如下: implementation 'androidx.media:media:1.2.0'而后,咱们新建一个LinphoneManager类用来治理Linphone sdk,比方将Linphone注册到服务器、拨打语音电话等。 class LinphoneManager private constructor(private val context: Context) { ... //省略其余代码 /** * 注册到服务器 * * @param username 账号名 * @param password 明码 * @param domain IP地址:端口号 */ fun createProxyConfig( username: String, password: String, domain: String, type: TransportType? = TransportType.Udp ) { core.clearProxyConfig() val accountCreator = core.createAccountCreator(corePreferences.xmlRpcServerUrl) accountCreator.language = Locale.getDefault().language accountCreator.reset() accountCreator.username = username accountCreator.password = password accountCreator.domain = domain accountCreator.displayName = username accountCreator.transport = type accountCreator.createProxyConfig() } /** * 勾销注册 */ fun removeInvalidProxyConfig() { core.clearProxyConfig() } /** * 拨打电话 * @param to String * @param isVideoCall Boolean */ fun startCall(to: String, isVideoCall: Boolean) { try { val addressToCall = core.interpretUrl(to) addressToCall?.displayName = to val params = core.createCallParams(null) //启用通话录音// params?.recordFile = LinphoneUtils.getRecordingFilePathForAddress(context, addressToCall!!) //启动低宽带模式 if (LinphoneUtils.checkIfNetworkHasLowBandwidth(context)) { Log.w(TAG, "[Context] Enabling low bandwidth mode!") params?.enableLowBandwidth(true) } if (isVideoCall) { params?.enableVideo(true) core.enableVideoCapture(true) core.enableVideoDisplay(true) } else { params?.enableVideo(false) } if (params != null) { core.inviteAddressWithParams(addressToCall!!, params) } else { core.inviteAddress(addressToCall!!) } } catch (e: Exception) { e.printStackTrace() } } ... //省略其余代码}CoreService接下来就是CoreService类,该类的作用是一个保活服务,在复电时会调用触动办法和启动告诉,所以必须在AndroidManifest.xml里注册。 ...

June 8, 2022 · 2 min · jiezi

关于android:如何通过AB测试提升Push推送消息点击率

618电商节炽热进行中,某电商App筹备向用户推送一条全局流动音讯,经营筹备了两个推送文案: 文案A:年中囤货咱们更懂你,没有大优惠怎敢轰动你:美妆个户,户外运动,医疗衰弱,一站式备齐,点击>> 文案B:全场特价1折起,跨店满减满300-30,会员更有折上折,6.1激情预售开启,当初就抢,一价到底,点击>> 哪个文案更能感动用户? 咱们能够用音讯推送来做个A/B测试来确定推送的文案。各抉择0.5%的沉闷用户,推送不同的文案后剖析用户的点击量数据。实际效果如下: 文案A的点击率为:3.3% 文案B的点击率为:11.4% 预先剖析,文案B中有用户可直观获取数字价值的促销计划,对用户有较大的吸引力,因而全量推送文案B无疑能让用户点击率和转化率更上一层楼。 利用音讯推送的A/B测试性能,反对针对不同文案、不同人群、不同工夫进行音讯推送比照测试,并在多组比照后果中,抉择成果更好地文案或者标签人群进行主动补发,智能化实现最优的推送测试,进步推送点击率。 经营人员会应用推送告诉来进步利用的日活或者唤醒缄默用户,让用户为他们的偏好投票,也让经营用起码的老本达到测试目标,继而在全量推送中达到最好的推送成果。 集成华为推送服务就能够应用推送服务的A/B测试性能,推送告诉试验能够对推送告诉的题目、文案、点击动作甚至是不同人群在不同工夫进行音讯推送比照测试等进行分组测试。可基于华为剖析输入的用户属性、受众群组等条件将试验指标用户按比例分成不同分组,每个组增加不同的策略。而后依据华为剖析服务得出不同分组的用户数据,如点击率,转化率等。 华为推送服务A/B测试推送成果 集成步骤首先,应用推送告诉类A/B测试之前,须要集成华为推送服务,能够参考推送服务官网文档进行集成。 操作流程集成推送服务后,须要在App Gallery Connect上对文案进行配置,上面我会联合一个具体的案例解说操作步骤。 如果你是一位电商App的经营,平台正在做红包营销流动。你想要对平台所有用户推送优惠券到账音讯,你设置了两组不同的文案,为了测试出内容最优(关上率最高)的一组文案,随机对App用户发送音讯进行A/B测试。首先登录App Gallery Connect网站,抉择“我的我的项目”在左侧导航栏中抉择“增长 > A/B测试”,找到右上角“创立试验”从下拉框中抉择“告诉试验” 填写本次A/B测试试验的名称和形容,这里咱们能够将试验命名为“618节日促销推送文案测试” 进入“抉择试验指标用户”页面,设置试验筛选用户和比例。咱们这里抉择 “所有用户”参加用户比例设置为5%,零碎会从所有用户中筛选出5%的用户,并平均分配到原始组和实验组中。 在“配置原始组和实验组”页面,咱们能够将两条待测试的推送文案信息填写在这里。原始组的文案为“您有5元现金红包已入账,限量可领,购物立减,手慢无”实验组的文案为“5元无门槛红包已到账,全场通用,仅限1天无效!”点击文案均跳转到首页。 在“抉择跟踪指标”页面,抉择本次推送想要跟踪的次要指标和主要指标。咱们本次测试想看两种不同推送文案的关上率,所以咱们将次要指标设置为“点击率” 在“设置音讯选项”页面,能够抉择推送工夫、推送有效期和推送重要性。点击“保留”会进入实验报告界面,在该界面能够查看本次A/B测试的具体推送成果。 通过以上5步,咱们就胜利实现了一次A/B测试推送,通过查看测试后果,咱们能够找出最现实的告诉文案和音讯出现形式,从而进步正式推送时的关上率和转化率。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 8, 2022 · 1 min · jiezi

关于android:用户界面-Android开发期末复习5

Android用户界面框架采纳MVC(Model-View-Controller)模型,解决用户输出的控制器(Controller)显示图像的视图(View)保留数据和代码的模型(Model) Android用户界面框架依照"先进先出"的规定从队列中获取工夫单线程用户界面 界面控件包含定制控件和零碎控件 常见的零碎控件 TextView,EditTextButton,ImageButtonCheckbox,RadioButtonSpinnerListViewTabHostwrap_content示意TextView的宽度只可能蕴含所显示的字符串fill_content示意未完待续。。。。

June 8, 2022 · 1 min · jiezi

关于android:组件通信与广播服务-Andorid开发期末复习4

Intent 是一种消息传递机制,用于组件之间的数据交换和发送播送音讯应用程序有多个Activity,Intent能够实现不同Activity之间的切换和数据传递显示启动 Intent intent = new Intent(IntentDemoActivity.this, NewActivity.class);startActivity(intent);隐式启动:升高组件之间的耦合度 用intent 启动一个网页 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("schemodemo://edu.hrbeu/path"));startActivity(intent);Intent.ACTION_VIEW是Intent的罕用动作,以Uri形式传送数据 获取Activity的返回值 先启动的Activity称为父Activity后启动的Activity称为子Activity 获取子Activity的返回值? 以Sub-Activity的形式启动子Activity显示启动 int SUBACTIVITY1 = 1;Intent intent = new Intent(ActivityCommunicationActivity.this, SubActivity1.class);startActivityForResult(intent, SUBACTIVITY1);隐式启动 int SUBACTIVITY2 = 2;Uri uri=Uri.parse("content://contacts/people");Intent intent = new Intent(Intent.ACTION_PICK,uri);startActivityForResult(intent, SUBACTIVITY2);设置子Activity的返回值在finish()之前调用setResult()函数返回数据给父Activity第一个参数是状态码第二个参数是返回值,它被封装在Intent中调用Intent的putExtra()办法增加额定信息 String uriString = editText.getText().toString();Uri data = Uri.parse(uriString); Intent result = new Intent(null, data);result.putExtra("name","xyy"); setResult(RESULT_OK, result);finish();在父Activity中获取返回值 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode){ case SUBACTIVITY1: if (resultCode == RESULT_OK){ Uri uriData = data.getData(); textView.setText(uriData.toString()); } break; case SUBACTIVITY2: if (resultCode == RESULT_OK){ Uri uriData = data.getData(); } break; }}Intent过滤器它是依据Intent中的动作action,类别category,数据data等内容,对承受该Intent的组件进行匹配和筛选机制 ...

June 8, 2022 · 1 min · jiezi

关于android:后台服务-Andorid开发期末复习3

Service比Activity具备更高的优先级Service的应用形式 启动形式绑定形式 应用通过服务链接(Connction)实现 应用Service的组件通过Context.bindService()建设连贯,通过Context.unbindService()断开连接如何实现Service()? public class RandomService extends Service{ @Override public void onCreate() { super.onCreate(); //实现代码 } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); //实现代码 } @Override public void onDestroy() { super.onDestroy(); //实现代码 } @Override public IBinder onBind(Intent intent) { return null; }}Service被绑定后调用的函数,可能返回Service的对象实例: public IBinder onBind(Intent intent){return Service的对象实例}Service的对象实例怎么写? 实现Service类须要在AndroidManifest.xml注册服务 <service android:name=".RandomService"/>在其余组件启动服务 显示启动 final Intent serviceIntent = new Intent(this, RandomService.class);startService(serviceIntent);stopService(serviceIntent);隐式启动 final Intent serviceIntent = new Intent();serviceIntent.setAction("edu.hrbeu.RandomService");//传递参数是Service 的包名地位除此之外还要在AndroidManifest.xml申明,让启动找到相应的服务 ...

June 8, 2022 · 1 min · jiezi

关于android:App上看到就忍不住点的小红点是如何实现的

你有没有发现,咱们解锁手机后桌面上App右上角总能看到一个小红点,这就是推送角标。推送角标指的是挪动设施上App图标右上角的红色圆圈,圆圈内的红色数字示意未读音讯数量。角标是一种比拟轻的揭示形式,通过直观的展示用户尚未浏览的信息数量,能够给用户营造一种紧张感,激发用户浏览的好奇心,从而让用户忍不住点开。因而在应用切当的状况下,推送角标有助于进步App推送关上率,放弃用户粘性。 HMS Core推送服务提供了设置桌面角标的API接口,开发者能够在音讯中封装角标参数。那这个“小红点”性能是如何实现的呢?以下是具体的集成步骤。 一.客户端API设置华为推送角标反对平台:1.零碎版本:EMUI4.1 及以上 2.桌面版本:6.3.29 3.反对设施:华为设施 角标性能开发:申明权限 < uses - permission android: name = "android.permission.INTERNET" / > < uses - permission android: name ="com.huawei.android.launcher.permission.CHANGE_BADGE " / >在须要进行角标显示中央,采纳如下办法传递数据给华为桌面利用。 Bundle extra = new Bundle(); extra.putString("package", "xxxxxx"); extra.putString("class", "yyyyyyy"); extra.putInt("badgenumber", i); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher .settings/badge/"), "change_badge", null, extra);要害参数阐明:package:利用包名 class:桌面图标对应的利用入口Activity类 badgenumber:角标数字 boolean mIsSupportedBade = true; if (mIsSupportedBade) { setBadgeNum(num); } /** set badge number*/ public void setBadgeNum(int num) { try { Bundle bunlde = new Bundle(); // com.test.badge is your package name bunlde.putString("package", "com.test.badge"); // com.test. badge.MainActivity is your apk main activity bunlde.putString("class", "com.test. badge.MainActivity"); bunlde.putInt("badgenumber", num); this.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde); } catch (Exception e) { mIsSupportedBade = false; }}非凡情景思考:(1)对于第三利用关上和退出时,是否还持续显示角标取决于利用传递的值(badgenumber为0时,不显示角标;badgenumber大于0时,显示角标)。 ...

June 8, 2022 · 1 min · jiezi

关于android:数据存储与访问-Andorid开发期末复习2

每次程序启动会读取配置文件,个别应用INI文件或XML文件或自定义,然而应用这些文件很繁琐改良?SharedPreferences! 将NVP(name/valuePair)保留在Android文件系统中它屏蔽课对文件系统的操纵过程它有三种拜访模式:MODE_PRIVATE,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE,SharedPreferences的实现 定义拜访模式 public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;定义名称 public static final String PREFERENCE_NAME = "SaveSetting";将模式和参数名称作为参数传递给getSharedPreferences(),获取其实例 SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);通过SharedPreferences.Editor对SharedPreferences进行批改,调用commit()进行提交 private void saveSharedPreferences(){ SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("Name", nameText.getText().toString()); editor.putInt("Age", Integer.parseInt(ageText.getText().toString())); editor.putFloat("Height", Float.parseFloat(heightText.getText().toString())); editor.commit(); }获取曾经保留的SharedPreferences中的数据 private void loadSharedPreferences(){ SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE); String name = sharedPreferences.getString("Name","Tom"); int age = sharedPreferences.getInt("Age", 20); float height = sharedPreferences.getFloat("Height",1.81f); ... }SharedPreferences的文件保留在哪?<data/data/<packege name>/shared_prefs 文件存储->程序如何读写流式文件?openFileOutput()和openFileInput() ...

June 7, 2022 · 1 min · jiezi

关于android:位置服务与地图应用-Andorid开发期末复习1

让程序提供位置服务-> 如何获取LocationManager? 通过调用android.app.Activity.getSystemService()函数String serviceString = Context.LOCATION_SERVICE;LocationManager locationManager =(LocationManager)getSystemService(serviceString);获取LocationManager后指定其定位办法 String provider = LocationManager.GPS_PROVIDER;Location location = locationManager.getLastKnownLocation(provider);调用location中的办法 double lat = location.getLatitude();double lng = location.getLongitude();监督地位变动 //参数阐明://provider:定位办法//2000:残剩地位扭转事件的工夫距离//0:间隔条件//locationListener:回调函数locationManager.requestLocationUpdates(provider, 2000, 0, locationListener);//locationListener的实现private final LocationListener locationListener = new LocationListener(){ @Override public void onLocationChanged(Location location) { getLocationInfo(location); } @Override public void onProviderDisabled(String provider) { getLocationInfo(null); } @Override public void onProviderEnabled(String provider) { getLocationInfo(null); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { }最初要使GPS定位失效须要在AndroidManifest.xml退出用户许可 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

June 7, 2022 · 1 min · jiezi

关于android:ViewPager2的滑动回弹动画

ViewPager2的滑动回弹动画首先剖析回弹动画的成果,滑动小于肯定阈值时,松手后触发,页面回弹到原地位。 切入点第一反馈就是onTouchEvent,发现ViewPager2没有重写,并且它是一个ViewGroup,咱们看它初始化的时候设置了什么,调用了 initialize,看到最终嵌套了一个自定义的RecyclerView,发现没有重写onTouchEvent,那么只有可能通过addOnScrollListener来拦挡触摸。 持续剖析initialize,咱们能够把指标锁定在ScrollEventAdapter和PagerSnapHelperImpl,通过查看类形容,咱们能够根本确定是在PagerSnapHelperImpl中实现的。 源码剖析咱们首要指标是追踪addOnScrollListener public void attachToRecyclerView(@Nullable RecyclerView recyclerView) throws IllegalStateException { ... mRecyclerView = recyclerView; if (mRecyclerView != null) { setupCallbacks(); ... }}private void setupCallbacks() throws IllegalStateException { ... mRecyclerView.addOnScrollListener(mScrollListener); ...}mScrollListener: @Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // 滚动进行后 if (newState == RecyclerView.SCROLL_STATE_IDLE && mScrolled) { mScrolled = false; snapToTargetExistingView(); }}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) { // 解决visible change的状况,具体看办法正文 if (dx != 0 || dy != 0) { mScrolled = true; }}snapToTargetExistingView: ...

June 7, 2022 · 2 min · jiezi

关于android:AR-Engine运动跟踪能力高精度实现沉浸式AR体验

随着电子产品的广泛利用,AR技术也开始宽泛遍及,在游戏、电商、家装等畛域都有波及。比方,在室内设计时,咱们能够通过AR技术在理论场景中进行虚构软装的搭配,使用华为AR Engine静止跟踪能力在理论利用中实时输入室内环境的三维坐标信息,确定事实室内环境和虚构软装之间的变换关系,从而稳固精准的实现软装在室内空间的正当搁置。 作为华为AR Engine的一项根本能力,静止跟踪能力次要通过继续稳固跟踪终端设备的地位和姿势绝对于周围环境的变动,同时输入周围环境特色的三维坐标信息,在AR 技术的理论利用中起到了框架搭建的作用,是构建事实世界和虚拟世界的桥梁。 个性介绍静止跟踪能力通过跟踪终端设备的地位和姿势绝对于周围环境的变动,能够确定终端设备的虚构坐标系与周围环境世界坐标系的变换关系,把终端设备的虚构坐标系一起对立到周围环境的世界坐标系下,从观察者视角渲染虚构物体,再叠加到摄像头图像中,从而实现虚构与事实在几何上的交融。 比方在下图AR车展的场景中,就须要借助静止跟踪的能力,实时跟踪摄像头绝对于周围环境的静止姿势和变动轨迹,通过建设虚拟世界和事实世界对立的几何空间,实现虚构汽车在事实高空上的精准搁置。 实现虚实交融的根本条件是实时跟踪终端设备的静止,并依据静止跟踪后果实时更新虚构物体状态,能力在事实和虚拟世界之间建设稳固的分割,所以说,静止跟踪的精度与品质间接影响AR利用的整体成果,但凡呈现提早、误差等状况,都会造成虚构物体抖动或者漂移,很大水平上毁坏AR体验的真实感和沉迷性。 个性劣势近日,华为AR Engine 3.0应用SLAM 3.0技术,在技术指标方面获得了进一步的晋升。 实现6DOF的静止跟踪形式(世界跟踪形式),能从不同间隔、方向、角度观察虚构物体,营造更加实在的AR体验环境;实现单目ATE(相对轨迹误差)低至1.6cm,确保虚构物体稳定性,体验成果更佳。立体检测时长小于1秒,立体辨认和扩大速度更快。 集成步骤一、 登录华为开发者联盟官网,创立利用。二、 集成AR Engine SDK。关上Android Studio我的项目级“build.gradle”文件。增加Maven代码库。(这里以7.0以下版本举例)在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。在“allprojects > repositories”中配置HMS Core SDK的Maven仓地址。buildscript { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url "https://developer.huawei.com/repo/" } }}allprojects { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url "https://developer.huawei.com/repo/" } }} 关上我的项目中利用级的“build.gradle”文件。dependencies {implementation 'com.huawei.hms:arenginesdk:3.1.0.1'}三、 代码开发查看以后设施是否装置了AR Engine,若曾经装置则失常运行,若没有装置被动跳转利用市场,申请装置AR Engine。private boolean arEngineAbilityCheck() { boolean isInstallArEngineApk = AREnginesApk.isAREngineApkReady(this); if (!isInstallArEngineApk && isRemindInstall) { Toast.makeText(this, "Please agree to install.", Toast.LENGTH_LONG).show(); finish(); } LogUtil.debug(TAG, "Is Install AR Engine Apk: " + isInstallArEngineApk); if (!isInstallArEngineApk) { startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class)); isRemindInstall = true; } return AREnginesApk.isAREngineApkReady(this);}运行前权限查看AndroidManifest外面配置相机权限<uses-permission android:name="android.permission.CAMERA" />private static final int REQUEST_CODE_ASK_PERMISSIONS = 1;private static final int MAX_ARRAYS = 10;private static final String[] PERMISSIONS_ARRAYS = new String[]{Manifest.permission.CAMERA};List<String> permissionsList = new ArrayList<>(MAX_ARRAYS);boolean isHasPermission = true;for (String permission : PERMISSIONS_ARRAYS) { if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { isHasPermission = false; break; }}if (!isHasPermission) { for (String permission : PERMISSIONS_ARRAYS) { if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { permissionsList.add(permission); } } ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_PERMISSIONS);}调用ARWorldTrackingConfig接口,创立静止跟踪ARSession,private ARSession mArSession;private ARWorldTrackingConfig mConfig;config.setCameraLensFacing(ARConfigBase.CameraLensFacing.FRONT); // 通过config.setXXX办法配置场景参数config.setPowerMode(ARConfigBase.PowerMode.ULTRA_POWER_SAVING);mArSession.configure(config);mArSession.resume();mArSession.configure(config);mSession.setCameraTextureName(mTextureDisplay.getExternalTextureId());ARFrame arFrame = mSession.update(); // 从ARSession中获取一帧的数据。// Set the environment texture probe and mode after the camera is initialized.setEnvTextureData();ARCamera arCamera = arFrame.getCamera(); // 能够从ARFrame中获取ARCamera,ARCamera对象能够获取相机的投影矩阵,用来渲染窗口。// The size of the projection matrix is 4 * 4.float[] projectionMatrix = new float[16];arCamera.getProjectionMatrix(projectionMatrix, PROJ_MATRIX_OFFSET, PROJ_MATRIX_NEAR, PROJ_MATRIX_FAR);mTextureDisplay.onDrawFrame(arFrame);StringBuilder sb = new StringBuilder();updateMessageData(arFrame, sb);mTextDisplay.onDrawFrame(sb);// The size of ViewMatrix is 4 * 4.float[] viewMatrix = new float[16];arCamera.getViewMatrix(viewMatrix, 0);for (ARPlane plane : mSession.getAllTrackables(ARPlane.class)) { // 从ARSession中获取所有的可跟踪立体。 if (plane.getType() != ARPlane.PlaneType.UNKNOWN_FACING && plane.getTrackingState() == ARTrackable.TrackingState.TRACKING) { hideLoadingMessage(); break; }}drawTarget(mSession.getAllTrackables(ARTarget.class), arCamera, viewMatrix, projectionMatrix);mLabelDisplay.onDrawFrame(mSession.getAllTrackables(ARPlane.class), arCamera.getDisplayOrientedPose(), projectionMatrix);handleGestureEvent(arFrame, arCamera, projectionMatrix, viewMatrix);ARLightEstimate lightEstimate = arFrame.getLightEstimate();ARPointCloud arPointCloud = arFrame.acquirePointCloud();getEnvironmentTexture(lightEstimate);drawAllObjects(projectionMatrix, viewMatrix, getPixelIntensity(lightEstimate));mPointCloud.onDrawFrame(arPointCloud, viewMatrix, projectionMatrix);ARHitResult hitResult = hitTest4Result(arFrame, arCamera, event.getEventSecond());if (hitResult != null) { mSelectedObj.setAnchor(hitResult.createAnchor()); // 在命中检测地位创立锚点,使得AREngine继续跟踪。}依据锚点地位来绘制所需的虚构物体。mEnvTextureBtn.setOnCheckedChangeListener((compoundButton, b) -> { mEnvTextureBtn.setEnabled(false); handler.sendEmptyMessageDelayed(MSG_ENV_TEXTURE_BUTTON_CLICK_ENABLE, BUTTON_REPEAT_CLICK_INTERVAL_TIME); mEnvTextureModeOpen = !mEnvTextureModeOpen; if (mEnvTextureModeOpen) { mEnvTextureLayout.setVisibility(View.VISIBLE); } else { mEnvTextureLayout.setVisibility(View.GONE); } int lightingMode = refreshLightMode(mEnvTextureModeOpen, ARConfigBase.LIGHT_MODE_ENVIRONMENT_TEXTURE); refreshConfig(lightingMode);});理解更多详情>> ...

June 7, 2022 · 2 min · jiezi

关于android:systrace-统计方法耗时

本文作者:Fangx3Android是单线程模型,用户的按键事件、屏幕触摸及 UI 绘制都在 UI 线程中解决。单线程意味着串行执行,如果某一个操作耗时了就会导致后续的操作都得期待,这个时候用户的第一感知就是卡了。所以在排查卡顿的时候有一个最简略的方法就是找出耗时长的办法。 如何统计办法耗时?在开发的时候想统计一个办法的耗时最简略的办法就是在办法的开始和完结地位打个工夫戳,两个工夫戳相减就是这个办法的耗时。 fun take() { val start = System.currentTimeMillis() //.. service.take(); //... val end = System.currentTimeMillis() val const = end - start}下面的办法能统计到咱们利用代码的耗时,然而无奈统计到 Android 的零碎办法耗时。其实 Android 零碎曾经在一些要害链路上曾经埋入了一些点位,然而它的实现不是像咱们这样埋入工夫戳,而是通过Trace类来实现的,而 Trace 类也反对咱们应用层调用插入自定义的点位,在通过 Android 提供的systrace工具,抓取解决 Trace 类打的点位信息。最终生成一个 Html 文件,通过 Chrome 能够直观的查看一个残缺链路的耗时状况。 systrace 在开发阶段的确是一个调优的利器,然而它有两个显著的限度导致这个利器无奈在线上应用: 须要连贯 PC 端,通过执行命令的形式开启 Trace 性能,须要开发者手动退出Trace.beginSection和Trace.endSection,这就变成了须要开发预判耗时地位手动退出 Trace 函数,然而线上环境无奈预判哪里会耗时。所以如果可能解决下面两个问题就能将 systrace 这个利器用于线上问题排查了。 脱离 PC 端运行 systrace这里简略画下 systrace 的工作原理: 从下面的图上能够看到 systrace 抓的数据能够分为两类: Java 层和 Native 层产生的函数调用信息内核态的事件信息其中 Java 层和 Native 层的函数调用信息就是咱们通过调用 Trace 类的办法收集起来的信息(也是这次咱们须要关怀的数据),数据信息会记录到trace_marker中;而内核态的工夫信息是通过 Linux 提供的 ftrace 性能,通过激活不同的事件节点,在内核运行时依据节点使能状态,会往 ftrace 缓冲中打点记录事件。最终 systrace 通过回捞上述两个数据整合生成一份 Html 文件。 ...

June 7, 2022 · 3 min · jiezi

关于android:聚焦AI新技术HMS-Core机器学习服务为移动应用智能化注入新动力

近年来,以机器学习为代表的人工智能技术(以下简称AI技术)蓬勃发展。新算法层出不穷,开发出的图像识别、自然语言、活体检测等能力令智能化的将来生存不再遥不可及。同时,这些AI技术正继续演变和倒退,数据和算力的限度也在被一直冲破。依靠层出不穷的新技术和新产品,交通出行、购物快递、金融理财等各类与用户生存非亲非故的利用App落地,成为开发者的聚焦点和发力点。 简略来说,机器学习是AI技术的一个分支,而深度学习则是机器学习的重要分支。HMS Core机器学习服务(ML Kit)为开发者提供了简略易用、服务多样、技术当先的机器学习能力,助力开发者更快更好地开发各类AI利用。 机器学习多畛域、全方位赋能开发者,迎利用新冲破金融交易与平安得益于互联网金融便利性的特点,用户应用挪动设施即可实现转账、理财等业务。但用户的数据以及资产平安始终备受质疑,通过训练机器学习模型来检测可能是欺诈行为的流动,能够实现危险可控的交易流程。 为了使服务更快、更平安,HMS Core机器学习服务能够与各种用户验证零碎(如生物辨认)合作,以辨认和验证流程。HMS Core机器学习服务中的人脸检测、活体检测和卡证辨认等能力对于那些在解决任何事务之前须要严格的用户批准的挪动利用来说,是一个不错的抉择。 智能人机交互语音辨认与语音合成两项技术的联合使人们可能解放双手,在机器学习的帮忙下,通过语音命令这一交互方式开启利用新体验。如智能家居、智能客服等利用现在已在生活中为咱们提供各式各样的服务。 一旦开发者的利用集成了机器学习服务,它就可能变得足够聪慧。当用户收回语音指令时,HMS Core 机器学习服务的实时语音辨认能力能够实现毫秒级实时辨认音频流,实验室测得辨认准确率高达95%以上。而语音合成能力能够间接将文字转化为天然晦涩的人声,让利用、设施"闭口谈话",用户体验更具共性。 跨语言交换从出国旅行,到国内文化交流、对外贸易,语言障碍是一个人造的痛点,随着国内企业、利用出海业务的增大,这一问题更是亟待解决。HMS Core机器学习服务能够实现源语言和目标语言的文本翻译,通过手机拍摄就能实时翻译外文指示牌、菜单、说明书等。 而在面对畛域多样、需要简单、实时性高的会议场景时,传统的文本翻译无奈满足同传高实时性的要求,基于此,HMS Core机器学习服务行将上线全面高效的机器同传解决方案。同声传译通过集成HMS Core机器学习服务中实时语音辨认、翻译、语音合成的能力,反对将音频流实时翻译为不同语种的文本,并输入多语种的音频内容,从而均衡了时延与准确度,实现多语种低成本的无效交换。 数字图像处理图像是人们形容和表白事物的表征与个性的重要形式。网络直播、线上教育、视频会议等场景蓬勃发展,图像的解决愈发显得重要,场景的倒退也给技术提出了更高的要求。于是,机器学习越来越多地利用到了实时音视频场景中,比方超分辨率、美颜、图像宰割等。HMS Core机器学习服务能够通过人像宰割技术,对视频的背景进行含糊解决,或替换视频背景,爱护隐衷的同时,还能够大大减少烦扰。 作为将含糊的图像变清晰的神奇技术,图像超分辨率是图像增强畛域一个十分重要的技术之一。无论是晚期的经典电影还是老照片,基于深度学习的超分算法,无需消耗大量的资源即可实现多媒体内容的高清重建工作,整个过程耗时短,实际效果却有着很大的晋升。此外,在医疗影像、交通系统、主动驾驶等畛域,图像处理技术也有不同水平的利用。 机器学习+N,提供多维度行业解决方案除了上述的多项利用场景,HMS Core机器学习服务使能泛滥畛域能力,继续凋谢AI技术助力开发者翻新利用,惠及用户工作与生存,满足更多的个性化定制诉求,进一步晋升利用智能化。 机器学习+情景感知,加强利用精细化体验AI并非通知用户学习如何操作,而是适应用户需要以提供精准高效的服务。如何更快、更精准的感知用户需要?晓得他们何时何地须要哪种服务?这是开发者和经营人员不断改进利用过程中面对的泛滥难题之一。 依靠机器学习服务,HMS Core情景感知服务( Awareness Kit) 反对提供更加精细化的体验感知,从用户状态辨认、用户行为辨认、设施状态辨认、人机交互感知、周边环境感知五个维度丰盛情景感知能力,并调用这些能力,帮忙App更疾速、高效地了解用户以后所处的情景,以便提供更加智慧、贴心的体验。 游览出行类App可能据此揭示用户目的地天气情况,为出行做好筹备,提供贴心的旅伴服务;音乐类App则能够依据用户活动状态或工夫,链接耳机或车载蓝牙,提供个性化的音乐举荐,如夜间行车音乐等;而生存服务类App可能在当用户靠近指标区域且停留肯定时长时,为其精准推送相干服务信息等。 机器学习+HiAI Foundation、 HiAI Engine,让利用更加智慧弱小面对随时变动的利用场景,HMS Core机器学习服务在模型轻量化、模型准确率、模型占有率上继续优化,致力于为开发者提供全面深刻的华为机器学习凋谢能力。利用集成HMS Core机器学习服务后,MindSpore Lite提供全场景AI推理框架,此框架接口易用、算子性能齐备、广泛支持第三方模型。 为开发者关上新世界大门的HUAWEI HiAI Foundation,推出了端云协同、Model Zoo、模型量化工具包、网络结构搜寻工具包、多IP深度协同等个性,一直赋能手机、平板、智能屏、车技、手表等终端设备,打造出更高性能更低功耗的计算环境,助力开发者疾速开发和部署AI利用。 HUAWEI HiAI Engine利用能力凋谢,反对将多种AI能力与利用集成,包含CV引擎--可能模仿人的视觉零碎感知周围环境,判断、辨认、了解空间组成;ASR引擎--将人的声音转化为文本,便于计算机进一步进行解析了解。NLU引擎--让计算机了解人的声音或文本,进行沟通或天然的动作。 计算机与网络的飞速发展使得机器学习的作用越来越大,也让人们的生存与工作产生扭转。将来,面对用户的精细化需要和挪动利用的智能降级,开发者们须要更多更好地机器学习技术,来实现利用翻新,为用户带来更加智能的体验帮。而HMS Core机器学习服务也将以此为指标笃定前行。欢送大家拜访华为开发者联盟官网,理解更多HMS Core AI畛域的技术能力细节,以及更多翻新凋谢能力。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 7, 2022 · 1 min · jiezi

关于android:Android经典蓝牙开发入门

一、根本介绍 所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,最后是由爱立信公司公司创造的。技术始于爱立信公司 1994 计划,它是钻研在移动电话和其他配件间进行低功耗、低成本无线通信连贯的办法。发明者心愿为设施间的通信发明一组对立规定(标准化协定)用来解决用户间互相不兼容的挪动电子设备。 1998年5月20日,索尼以立信、国内商业机器、英特尔、诺基亚及东芝公司等业界龙头创建“特地兴趣小组”(Special Interest Group SIG),即蓝牙技术联盟的前身,指标是开发一个成本低、效益高、能够在短距离范畴内随便无线连接的蓝牙技术标准,是负责蓝牙标准的制订和推广的国内组织。 蓝牙倒退至今经验了多个版本的更新,1.1、1.2、2.0、2.1、3.0、4.0、4.1、4.2、5.0等。其中,将1.x~3.0之间的版本称之为经典蓝牙,4.x开始的蓝牙称之为低功耗蓝牙,也就是蓝牙ble。依据利用、协定类型等,能够对蓝牙进行以下分类: <br/> 二、经典蓝牙API介绍 Android平台蕴含蓝牙网络堆栈反对,此反对能让设施以无线形式与其余蓝牙设施替换数据。利用框架提供通过Android Bluetooth API拜访蓝牙性能的权限。这些API容许利用以无线形式连贯到其余蓝牙设施,从而实现点到点和多点无线性能。Android利用可通过Bluetooth API执行以下操作: 扫描其余蓝牙设施查问本地蓝牙适配器的配对蓝牙设施建设 RFCOMM 通道通过服务发现连贯到其余设施与其余设施进行双向数据传输治理多个连贯以下对经典蓝牙开发相干的API进行介绍: 1、BluetoothAdapter类 BluetoothAdapter代表了挪动设施的本地的蓝牙适配器, 通过该蓝牙适配器能够对蓝牙进行基本操作, 例如 : 启动设施发现,获取已配对设施,通过mac蓝牙地址获取蓝牙设施等。 (1)获取本地蓝牙适配器实例办法定义: /** * 作用: * 获取本地蓝牙适配器实例 * 参数: * 无 * 返回: * 如果设施具备蓝牙性能,返回BluetoothAdapter 实例;否则,返回null对象。 */public static synchronized BluetoothAdapter getDefaultAdapter();应用阐明: 1、获取默认本地蓝牙适配器的句柄。目前Android仅反对一个蓝牙适配器,但该API能够扩大为反对更多。(2)关上蓝牙办法定义: /** * 作用: * 关上蓝牙 * 参数: * 无 * 返回: * 如果蓝牙开始关上,则返回true;如果蓝牙关上产生问题,则返回false。 */public boolean enable();应用阐明: 1、须要 BLUETOOTH_ADMIN权限。 2、该办法将不通过用户批准,间接启用底层蓝牙硬件,并启动所有蓝牙零碎服务。因为不同Android设施零碎的实现不同,所以局部Android零碎在调用该办法时也会弹框申请用户批准。 3、关上蓝牙,还能够通过调用startActivityForResult办法,应用ACTION_REQUEST_ENABLE用意来实现,此办法将弹出对话框,申请容许关上蓝牙。能够在Activity中的onActivityResult()办法中解决操作后果。 4、该办法是一个异步调用:它将立刻返回后果。如果此调用返回true,则适配器状态将立刻从STATE_OFF转换为STATE_TURNING_ON,并且稍后过渡到STATE_OFF或STATE_ON 。如果此调用返回false,则阐明呈现问题阻止适配器开启,例如设施处于航行模式,或者蓝牙已关上。因而还该当监听ACTION_STATE_CHANGED播送,以跟踪后续蓝牙状态更改。(3)敞开蓝牙办法定义: ...

June 6, 2022 · 6 min · jiezi

关于android:使用APICloud开发app的动态权限及Android平台targetSdkVersion设置教程

先介绍一下对于Android动静权限和targetSdkVersion背景: targetSdkVersion:自2018年11月开始,GooglePlay以及国内大部分利用市场要求app编译指标SDK必须为26及以上,否则不予提交审核;有许多已有app转到APICloud开发后,因targetSdkVersion降级而导致无奈笼罩装置;2020年以来,国家网信办等监管机构也增强了对app权限合规的监管。 动静权限:Android自零碎6.0开始,提供动静权限机制,对于敏感权限(存储,定位,录音,拍照,录像等),须要在app运行过程中动静向用户申请,这就和iOS零碎的权限应用体验保持一致了(iOS始终以来就是动静权限)。 应用APICloud开发平台开发app时,如果须要获取权限,须要动静申请。因而APICloud开发平台对立了Android和iOS两个平台的动静权限操作,提供两个API:hasPermission 和 requestPermission。文档地址为:https://docs.apicloud.com/Cli... 在Android上应用动静权限,要求app编译的指标SDK(即targetSdkVersion)为23及以上(对应为android6.0及以上零碎),22及以下零碎会执行缺省解决(手机厂商也可能定制解决),APICloud为满足更广泛的开发需要,默认配置targetSdkVersion为22,即权限走零碎缺省解决。 开启动静权限,须要依照以下阐明操作: 1、新建manifest.xml文件,增加如下代码: <?xml version="1.0" encoding="UTF-8"?><manifest> <application name="targetSdkVersion" value="28"/></manifest>将其中的targetSdkVersion更新为目标值,例如30; 2、将manifest.xml置于你的/我的项目代码/res/目录下(widget/res/manifest.xml); 3、将你的app代码中所有波及到须要动静权限的操作,参照示例中的代码,革新一遍(例如进行拍照录制视频等须要应用摄像头,以前的缺省解决中不须要申请摄像头权限,而开启动静权限后,必须在进行拍照之前,判断是否有摄像头权限,没有则进行申请,只有用户批准了摄像头权限能力进行接下来拍照的操作); 4、提交代码; 5、云编译界面勾选app所需的权限; 6、云编译app或自定义loader即可。 在这里须要留神的是,当你设置的targetSdkVersion大于等于23时,即意味着开启了动静权限,如果你的app带有获取IMEI、定位、录音、拍照、录像等敏感性能时,必须应用动静权限机制,先判断是否具备该性能操作权限,再进行操作,如果不具备相应的权限,对应的性能是生效的,也可能导致app解体。 为保障动静权限尽可能适配更多厂商的手机以及顺利上线Google Play,targetSdkVersion目前举荐设置为30。 以下为代码示例: <!DOCTYPE HTML><html><head> <meta charset="UTF-8"> <meta name="viewport" content="maximum-scale=1.0, minimum-scale=1.0, user-scalable=0, initial-scale=1.0, width=device-width" /> <meta name="format-detection" content="telephone=no, email=no, date=no, address=no"> <title>权限治理</title> <link rel="stylesheet" type="text/css" href="./css/api.css" /> <link rel="stylesheet" type="text/css" href="./css/box.css" /> <script type="text/javascript" src="./script/public.js"></script> <style> .marg { margin: 3px 15px; font-size: 18px; } </style> <script type="text/javascript"> apiready = function () { } function hasPermission(one_per) { var perms = new Array(); if (one_per) { perms.push(one_per); } else { var prs = document.getElementsByName("p_list"); for (var i = 0; i < prs.length; i++) { if (prs[i].checked) { perms.push(prs[i].value); } } } var rets = api.hasPermission({ list: perms }); if (!one_per) { apialert('判断后果:' + JSON.stringify(rets)); return; } return rets; } function reqPermission(one_per, callback) { var perms = new Array(); if (one_per) { perms.push(one_per); } else { var prs = document.getElementsByName("p_list_r"); for (var i = 0; i < prs.length; i++) { if (prs[i].checked) { perms.push(prs[i].value); } } } api.requestPermission({ list: perms, code: 100001 }, function (ret, err) { if (callback) { callback(ret); return; } var str = '申请后果:\n'; str += '申请码: ' + ret.code + '\n'; str += "是否勾选\"不再询问\"按钮: " + (ret.never ? '是' : '否') + '\n'; str += '申请后果: \n'; var list = ret.list; for (var i in list) { str += list[i].name + '=' + list[i].granted + '\n'; } apialert(str); console.log(JSON.stringify(ret)); }); } function opWithPermission(perm) { if (!confirmPer(perm)) { return; } if ('calendar' == perm) { //操作日历 } else if ('camera' == perm) { api.getPicture({ sourceType: 'camera', mediaValue: 'pic', destinationType: 'url', }, function (ret, err) { if (ret) { apialert(JSON.stringify(ret)); } else { apialert(JSON.stringify(err)); } }); } else if ('contacts' == perm) { api.openContacts({ test: true }, function (ret, err) { if (ret && ret.status) { apialert(JSON.stringify(ret)); } else { apialert(JSON.stringify(err)); } }); } else if ('location' == perm) { api.getLocation(function (ret, err) { if (ret && ret.status) { apialert(JSON.stringify(ret)); } else { apialert(JSON.stringify(err)); } }); } else if ('microphone' == perm) { api.startRecord({ path: 'fs://perm-test.amr' }); } else if ('phone' == perm) { api.call({ type: 'tel', number: '10086' }); } else if ('sensor' == perm) { //操作身材传感器 } else if ('sms' == perm) { api.sms({ numbers: ['10086'], text: '余额', silent: true }); } else if ('storage' == perm) { api.readFile({ path: 'fs://test.txt' }, function (ret, err) { if (ret.status) { console.log('readFile: ' + ret.data); } else { apialert(err.msg + ": \n" + api.fsDir); } }); } } function confirmPer(perm) { var has = hasPermission(perm); if (!has || !has[0] || !has[0].granted) { api.confirm({ title: '揭示', msg: '没有取得 ' + perm + " 权限\n是否返回设置?", buttons: ['去设置', '勾销'] }, function (ret, err) { if (1 == ret.buttonIndex) { reqPermission(perm); } }); return false; } return true; } </script></head><body> <div> <div id="wrap"> <div id='header'> <div class="back" tapmode="back-aconclick="api.closeWin()">返回</div> <h1>权限治理测试</h1> <div class="adpt"></div> </div> <div class='itemtitle'>一、判断权限</div> <div class='marg'>请抉择一个或者多个权限进行判断:</div> <div class='marg'>日历&emsp;&emsp;&emsp;<input type="checkbox" name="p_list" value="calendar" /></div> <div class='marg'>相机&emsp;&emsp;&emsp;<input type="checkbox" name="p_list" value="camera" /></div> <div class='marg'>通讯录&emsp;&emsp;<input type="checkbox" name="p_list" value="contacts" /></div> <div class='marg'>地位信息&emsp;<input type="checkbox" name="p_list" value="location" /></div> <div class='marg'>麦克风&emsp;&emsp;<input type="checkbox" name="p_list" value="microphone" /></div> <div class='marg'>电话&emsp;&emsp;&emsp;<input type="checkbox" name="p_list" value="phone" /></div> <div class='marg'>身材传感器<input type="checkbox" name="p_list" value="sensor" /></div> <div class='marg'>短信&emsp;&emsp;&emsp;<input type="checkbox" name="p_list" value="sms" /></div> <div class='marg'>存储空间&emsp;<input type="checkbox" name="p_list" value="storage" /></div> <div class="clickbtn" tapmode="active" onclick="hasPermission()">点击开始判断</div> <div class='itemtitle'>二、申请权限</div> <div class='marg'>请抉择一个或者多个权限进行申请:</div> <div class='marg'>日历&emsp;&emsp;&emsp;<input type="checkbox" name="p_list_r" value="calendar" /></div> <div class='marg'>相机&emsp;&emsp;&emsp;<input type="checkbox" name="p_list_r" value="camera" /></div> <div class='marg'>通讯录&emsp;&emsp;<input type="checkbox" name="p_list_r" value="contacts" /></div> <div class='marg'>地位信息&emsp;<input type="checkbox" name="p_list_r" value="location" /></div> <div class='marg'>麦克风&emsp;&emsp;<input type="checkbox" name="p_list_r" value="microphone" /></div> <div class='marg'>电话&emsp;&emsp;&emsp;<input type="checkbox" name="p_list_r" value="phone" /></div> <div class='marg'>身材传感器<input type="checkbox" name="p_list_r" value="sensor" /></div> <div class='marg'>短信&emsp;&emsp;&emsp;<input type="checkbox" name="p_list_r" value="sms" /></div> <div class='marg'>存储空间&emsp;<input type="checkbox" name="p_list_r" value="storage" /></div> <div class="clickbtn" tapmode="active" onclick="reqPermission()">点击开始申请</div> <div class='itemtitle'>三、须要权限的API操作</div> <div class='marg'>1、日历</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('calendar')">点击操作日历</div> <div class='marg'>2、相机</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('camera')">点击操作照相机</div> <div class='marg'>3、通讯录</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('contacts')">点击操作通讯录</div> <div class='marg'>4、地位信息</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('location')">点击操作地位信息</div> <div class='marg'>5、麦克风</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('microphone')">点击操作麦克风</div> <div class='marg'>6、电话</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('phone')">点击操作电话</div> <div class='marg'>7、身材传感器</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('sensor')">点击操作身材传感器</div> <div class='marg'>8、短信</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('sms')">点击操作短信</div> <div class='marg'>9、存储空间</div> <div class="clickbtn" tapmode="active" onclick="opWithPermission('storage')">点击操作存储空间</div> <br> </div> </div></body></html>

June 6, 2022 · 4 min · jiezi

关于android:adb操作命令

文件读写权限受权: adb chmod 777 文件名 显示以后运行的全副模拟器: adb devices 启动ADB: adb start-server 进行ADB: adb kill-server 装置应用程序: adb install -r [apk文件] 卸载应用程序: adb uninstall [packagename] 讲手机设施中的文件copy到本地计算机: adb pull 设施目录 本地目录 将本地计算机的文件copy到手机设施中: adb push 本地目录 手机设施目录 列出手机装的所有apk包名: adb shell pm list packages零碎利用:adb shell pm list packages -s第三方利用:adb shell pm list packages -3 通过adb启动应用程序页面: adb shell am start -n[包名+activity名] 革除利用缓存信息: adb shell pm clear [packagename] 获取设施的ID和序列号: adb get-product adb get-serialno 导出设施信息adb get-serialno > 序列号.txtadb shell cat /sys/class/net/wlan0/address > MAC地址.txtadb shell getprop ro.product.model > 设施型号.txtadb shell getprop ro.build.version.release> 零碎版本.txtadb shell pm list packages -s > 零碎利用的所有包名.txtadb shell pm list packages -3 > 第三方利用包名.txtadb shell wm size > 屏幕分辨率.txtadb shell wm density > 屏幕密度.txtadb shell cat /proc/cpuinfo > CPU信息.txtadb shell pm list permissions -f > 权限.txtadb shell pm list users -f > 用户.txt ...

June 6, 2022 · 1 min · jiezi

关于android:如何获取华为运动健康服务授权码并调用Rest-API访问数据

华为静止衰弱服务(HUAWEI Health Kit)容许三方生态利用在获取用户受权后,通过REST API接口拜访数据库,读取华为和生态搭档凋谢的静止衰弱数据或写入数据到华为静止衰弱服务,为用户提供更加个性化的衰弱改善服务。如静止类App在获取受权码后能够读取华为用户的心率、步数等静止数据,最终给用户提供衰弱倡议。 1. 申请帐号服务和申请静止衰弱服务Health Kit须要用户登录和受权,须要先申请帐号服务,能够在申请帐号服务的同时创立利用,也能够为曾经创立的利用开明帐号服务。创立胜利后,能够在帐号服务列表里查看已创立的利用,点击条目能查看到的详细信息如下图所示。其中的APP ID,APP SECRET和回调地址前面会用到。 2. 获取受权码code相比于其余Kit的REST API,Health Kit应用前须要取得受权码登录华为帐号后获取到受权码,多了一个获取受权码Code的步骤。 开发指南对受权码登录做了具体介绍,此处共有client_id,response_type,redirect_uri和scope共四个必传字段,其中client_id, 是在创立利用胜利后主动生成的APP ID。redirect_uri 是申请帐号服务步骤中填写的“回调地址”。 在用户输出华为帐号登录受权之后,网页浏览器会跳转到redirect_uri对应的链接,并且把所须要的受权码code作为参数追加在链接前面。 看一下官网给出的示例申请,在电脑或手机浏览器中关上上述链接,都会显示如下的华为帐号登录和受权页面。 登录受权胜利之后浏览器会跳转如下链接 其中接口须要用到的受权码code就是链接中申请载荷参数code的字符串值。 须要留神的是:这边控制台中的code是urlencode编码前的字符串,浏览器中的code是urlencode编码后的字符串。 在后续步骤次要应用的是urlencode编码前的code的值。(浏览器中的code须要进行urlencode解码再应用) 接下来须要通过下面获取到的受权码code,获取access_token和refresh_token。 因为应用限度,接下来的步骤不能再应用官网demo的参数进行测试了,须要创立本人的利用。而后传入本人我的项目相干的参数,反复上述步骤获取受权码code。 创立的利用的相干参数,都能够在“应用服务”-“帐号”上面找到,如下是创立的一个测试利用的信息页面。 1.应用受权码Code获取ATclient_id,redirect_url须要和获取受权码code应用的统一。 code参数是urlencode编码前的code的值。 client_secret参数是下面利用信息里的APP SECRET。 2 .Refresh Token获取access_token 3.应用获取到的access_token测试数据相干API因为咱们下面登录受权时,申请了获取身高体重的权限,所以在此测试一下获取身高数据的接口。 参照“查问最新采样数据”的文档链接,依照文档中postman申请测试后果如下: Head外面的参数:Authorization 字段值为: Bearer+‘空格’+ access_token值,形如:Bearer {access_token} ,x-client-id 的值须要和上方应用的client_id统一。 申请参数“dataTypeName”:“com.huawei.instantaneous.body_weight”在数据类型-体重-原子采样数据类型能够找到:https://developer.huawei.com/... 如果要同时查问多个数据,申请url示例如下:https://health-api.cloud.huaw...链接后拼接多个dataType参数即可。 理解更多详情>> 拜访华为静止衰弱服务联盟官网 拜访华为静止衰弱场景解决方案 获取华为静止衰弱服务开发领导文档

June 6, 2022 · 1 min · jiezi

关于android:开发者必读2022年移动应用出海趋势洞察白皮书

华为开发者联盟与艾瑞征询联结公布《2022年挪动利用出海趋势洞察白皮书》,本白皮书联合多种钻研办法剖析挪动利用的出海吸引力、海内市场抉择、出海的痛点及挑战,为现阶段挪动利用企业的出海战略决策提供市场洞察,并针对出海挑战出现应答策略,助力挪动利用开发者出海。 华为开发者联盟始终致力于全方位联接寰球开发者,以当先技术和凋谢能力赋能开发者翻新,以丰盛多元的经营推广资源减速开发者商业胜利,携手寰球开发者共建HMS生态瘠田。以下内容摘自白皮书。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 2, 2022 · 1 min · jiezi

关于android:FAQ接入华为帐号服务过程中常见问题总结

华为帐号服务(Account Kit)为开发者提供简略、平安的登录受权性能,用户不用输出帐号、明码和繁琐验证,就能够通过华为帐号疾速登录利用,即刻应用App。这篇文章收集了开发者们集成华为帐号服务中会遇到的典型问题,并给出了解决办法,心愿为其余遇到相似问题的开发者提供参考。 1 .redirect_url是什么,如何配置回调地址(1)回调地址redirect_rul不须要是实在的页面地址,redirect_rul是OAuth2.0协定定义的一个用来做以下用处的虚拟地址,用户配置一个https://xxxx相似的自定义字符串就好了。(最好依据本人业务属性定义一个有意义的字符串) (2)在OAuth2.0协定中redirect_url的用处如下: 如果是web利用,OAuth服务器受权后,会回调跳转到这个地址。web利用须要拦挡这个回调地址来接管Auth Code。获取AT的时候,要把回调地址作为参数传回,OAuth服务器会校验回调地址和code是匹配的,否则返回错误码。 (3)如何设置redirect_url? 参见官网文档阐明 2 .openId、unionId有什么区别?openId:同一个用户,不同利用,openId值不同,单个利用内惟一。 unionId:开发者帐号ID,同一个用户,同一个开发者帐号下治理的不同利用,unionId雷同。 利用接入华为帐号登录能够获取到OpenId(同一个用户的不同利用,OpenId值不同),应用OpenId标识用户,多个利用之间同一个华为帐号用户在开发者零碎内会被标识为多个用户。如果开发者心愿在多个利用之间标识用户的唯一性,能够应用UnionId(对于同一个用户,同一个开发者帐号下治理的不同利用,UnionId值雷同)。特地留神的是,标识用户唯一性的利用必须是在同一个开发者帐号下治理,一个利用转移到另外一个帐号后,UnionId值也会变动。 3. 怎么判断帐号是否已登录?通过silentSignIn接口,调用到onSuccess外面并且拿到的authAccount不为空则阐明回调胜利,帐号是已登录状态。 Task<AuthAccount> task = service.silentSignIn(); task.addOnSuccessListener(new OnSuccessListener<AuthAccount>() { @Override public void onSuccess(AuthAccount authAccount) { if(null != authAccount) { showLog("success "); } } });4 .调用服务端接口user.getTokenInfo接口报错invalid session(1)排查传参是否正确 (2)access_token须要UrlEncode一下,不然外面有特殊符号的解析就会报invalid session 接口文档: https://developer.huawei.com/... 5 .调用oauth2/v3/token接口,redirect_uri是否必传(1)应用Authorization Code换取Access_Token、Refresh Token、ID Token,这个参数是必须要传入的 (2)应用Refresh Token获取新的Access Token,redirect_url不须要传 参考官网文档 6. Authorization Code 、Access Token、Refresh Token的有效期别离是多久?Authorization Code的有效期是5分钟,该code是一次性的,申请后应用一次之后就会生效。 Access Token的有效期是1小时。 Refresh Token Token以后默认有效期180天。 7. 常见错误码剖析7.1 错误码:907135700该错误码阐明调用网关查问利用scope失败,能够排查上面几项: ...

June 2, 2022 · 1 min · jiezi

关于android:海量编辑功能玩转音乐世界

随着短视频时代的到来,音视频剪辑利用一直减少,市场竞争愈发强烈,如何为用户提供差异化剪辑性能和优质的音频解决体验,已成为行业新的挑战。 “音频音乐剪辑“是武汉网幂科技开发的一款手机音频剪辑利用,反对音乐剪辑、音频提取、伴奏人声提取、格局转换、手机铃声制作、拼接、变速、混音、录音、降噪等性能。为了给用户更好的音频剪辑体验,”音频音乐剪辑“团队始终在一直优化翻新利用各类性能,满足用户不同的音乐剪辑需要。 疾速高效集成,优质计划省时省力HMS Core音频编辑服务提供标准化能力的合集,帮忙音频音乐剪辑团队节俭开发人力,仅须要简略的集成便实现了新性能(录音配音与音频特效)的上线,减速了版本迭代周期。助力网幂科技打造更全面高效、具备更弱小音频解决能力的”音频音乐剪辑“。 新性能趣味满满,博得用户正向反馈通过集成HMS Core音频剪辑服务的AI配音能力,”音频音乐剪辑“晋升了文字转语音成果,用户只须要输出文字,即可生成天然晦涩、情感丰满的朗诵语音。与此同时,音频剪辑服务的音频特效能力为利用提供包含声场、环境音效、均衡器、变声、空间渲染等音频成果能力。 联合”音频音乐剪辑“本身的UI设计格调,在利用内组成了一个残缺音频特效工具。更全面高效的音频解决性能有助于晋升用户音频作品品质。据利用后盾统计,新性能的用户满意度在单月晋升32%【1】。 携手HMS Core,”音频音乐剪辑“将继续优化利用,开掘翻新更多的音乐剪辑性能,为用户打造更高质量更便捷的音频剪辑体验。 【1】数据来源于利用“音频音乐剪辑”经营部门 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 1, 2022 · 1 min · jiezi

关于android:HMS-Core分析服务650版本更新啦

卸载用户价值的正当评估对制订相应的用户召回策略具备重要意义。 HMS Core剖析服务新版本反对查看用户卸载前应用次数、解体次数等指标。通过这些数据,您能够更直观地判断已卸载人群粘性以及解体问题对用户留存的间接影响,及时调优,缩小用户散失。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 31, 2022 · 1 min · jiezi

关于android:如何用HMS-Core位置和地图服务实现附近地点路径规划功能

日常出行中,门路布局是很重要的局部。用户想要去往某个地点,获取到该地点的所有门路,再依据预估出行工夫自行抉择适合的路线,极大不便出行。平时生存中也存在大量应用场景,在出行类App中,依据乘客的目的地能够为用户布局适合出行路线和预计达到工夫;便捷生存类App中,用户能够搜寻指定范畴内的周边服务,查看去每个服务点的路线;外卖App中,正当进行门路布局能够更不便骑手接单送货。 HMS Core位置服务和地图服务联合即可实现该性能。能够先应用位置服务的地位搜寻能力,通过指定的关键字和可选的天文范畴对周边的环境进行搜寻,而后再应用地图服务的门路布局能力,展现出达到目的地的门路。在确定地位时,基于GNSS、Wi-Fi、基站等多种混合定位模式,帮忙利用疾速、精准地获取地位信息。获取地位信息后,集成地图服务,地图数据可笼罩超过200个国家和地区,反对数百种语言,全方位晋升用户体验。不仅如此,地图服务还能够依据不同的交通工具及实时路况信息,给出不同门路布局计划及预估达到工夫。 成果展现地图服务提供3种交通工具,驾车、骑行和步行。依据不同的交通工具,能疾速计算出几种适合的门路布局计划,给出间隔及预估达到工夫。 不同交通工具 不仅如此,地图服务还能够依据路况信息,提供间隔短和速度快这两种可供选择的路线偏好,极大晋升用户体验。 路线偏好设置 开发步骤集成筹备AGC账号注册,我的项目创立1) 注册成为开发者 注册地址:请点击链接 2) 创立利用,增加sha256,开启map/site开关,下载json文件 集成华为地图服务和位置服务SDK1) 将“agconnect-services.json”文件拷贝到利用级根目录下 • 在“allprojects > repositories”中配置HMS Core SDK的Maven仓地址。 • 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。 • 如果App中增加了“agconnect-services.json”文件则须要在“buildscript > dependencies”中减少agcp配置。 buildscript { repositories { maven { url 'https://developer.huawei.com/repo/' } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.3.2' classpath 'com.huawei.agconnect:agcp:1.3.1.300' }}allprojects { repositories { maven { url 'https://developer.huawei.com/repo/' } google() jcenter() }}2) 在“dependencies ”中增加如下编译依赖 dependencies { implementation 'com.huawei.hms:maps:{version}' implementation 'com.huawei.hms:site:{version}'}3) 在文件头增加配置 ...

May 31, 2022 · 2 min · jiezi

关于android:一起看-IO-Android-Auto-更新一览

在 Google,咱们在汽车畛域的工作始终依循发明平安、无缝连贯体验的愿景。如果没有像您这样的开发者参加其中,这项工作定然难以完成。咱们很快乐与大家分享咱们在过来一年协力获得的一些成就,并介绍新更新内容,让您能更轻松地为用户提供更好的行车应用体验。观看 Android Auto 更新一览 视频理解更多详情。 Android Auto 正在一直倒退扩张,目前寰球兼容此平台的车辆已超过 1.5 亿辆。越来越多的车辆还兼容无线技术,通过新推出的 Motorola MA1 适配器,当初有更多的驾驶员能够无线接入 Android Auto。此外,咱们为 Android Auto 打造的新设计为每种设施屏幕都提供了分屏性能,将导航和媒体居中出现的同时还留出空间,突出显示告诉模块。 内置 Google 服务的 Android Automotive 操作系统也带来令人兴奋的更新。在汽车制造商继续扩张,一直推出新车型的同时,咱们也始终致力于开发更多的驻车应用体验,以利用多种搭载 AAOS 操作系统的车型的大屏幕劣势。从更多像 Epix Now 和 Tubi 这类视频串流利用,到浏览和投射等面向未来的性能,有大量令人期待的新性能。同时,因为咱们曾经可能轻松将大屏幕平板电脑利用无缝连贯到驻车应用体验中,您比以往更容易为车内用户提供服务。 咱们晓得,为汽车开发利用是很简单的事件,因而咱们专一于简化 Android for Cars 的开发工作。咱们的 汽车利用库 (Car App Library) 发展势头强劲,迄今已公布 200 多个利用。除了在 1.3 版丰盛了导航功能集以外,咱们还很快乐地通知大家,当初所有开发者都能够将 受反对类别的利用 间接公布到 Android Auto 和 Android Automotive 操作系统的生产环境中。此外,咱们还创立了新模板并扩大了咱们反对的利用类别,将 Lyft 等驾驶员利用增加到导航类别,并将停车和充电类别替换为综合趣味点 (POI) 类别,以包含 MochiMochi 和 Fuelio 等利用。 咱们还推出了数项新性能,可帮忙您在 Android Auto 上构建性能更丰盛的媒体利用。媒体举荐可与 Google 助理搭配应用,让用户只需点击按钮,即可依据其首选音乐提供商轻松发现并疾速播放相干内容。如要显示来自您的利用的举荐,请集成此 API。 ...

May 30, 2022 · 1 min · jiezi

关于android:View的Temporary-Detach状态

View的Temporary Detach状态探索TemporaryDetach与Detach的关系 切入点起因是在剖析RecyclerView缓存机制时,在类正文形容的Scrap中,提到了处于temporary detached状态的View。 间接在View办法表中搜寻temporary可发现一系列办法。 源码剖析对于View来说: 通过比照dispatchStartTemporaryDetach和dispatchDetachedFromWindow public void dispatchStartTemporaryDetach() { mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH; notifyEnterOrExitForAutoFillIfNeeded(false); notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); onStartTemporaryDetach();}void dispatchDetachedFromWindow() { ... notifyEnterOrExitForAutoFillIfNeeded(false); notifyAppearedOrDisappearedForContentCaptureIfNeeded(false);}能够发现前者是后者是轻量级操作,只做了一小部分解决,简直没什么影响。onStartTemporaryDetach办法正文中提到了ViewGroup#detachViewFromParent(View),咱们转移到剖析ViewGroup: protected void detachViewFromParent(View child) { child.setDetached(true); removeFromArray(indexOfChild(child));}在ViewGroup的视角下,Detach对应removeView,比照detachViewFromParent和removeView,能够发现,也是属于轻量级操作,只是简略的从视图层级构造中移除了。 论断TemporaryDetach是Detach的轻量级操作,益处是期间不参加layout、draw、measure三大流程

May 30, 2022 · 1 min · jiezi

关于android:用HMS-Core地图服务自定义地图样式给你的应用制作专属个性化地图

不同行业的开发者对地图款式的展现需要差别很大。例如,物流类利用心愿地图款式简洁一些,重点突出城市散布和快递门路;AR游戏类利用中的地图色调须要和游戏UI适配,做的更酷炫一些;景区导览利用中的地图款式要景区特色相结合,重点出现要害景点。 自定义地图款式能够更好的投合不同行业的开发者对于地图款式的展现需要,开发者能够综合思考本身产品的应用场景、品牌色调等因素,自在创立最适宜的地图款式。 HMS Core地图服务(Map Kit)提供了自定义地图款式能力,开发者可通过更改Petal Maps Studio中的款式选项,自定义地图款式的显示,更改路线、公园、企业和其余趣味点等性能的可视化显示。提供七大类,上百种地图元素的款式编辑,让开发者自在编辑个性化地图。同时,开发者只需编辑一次,地图即可实用于多种终端(Android/iOS/Web)极大的进步了开发效率 集成步骤一、 生成款式ID 1. 登录Petal Maps Studio,点击“Create map”创立自定义款式。 2. 导入JSON款式文件,点击“Import”。 3. 在编辑器里批改款式。 4. 点击“SAVE”生成预览ID,通过预览ID测试款式成果。点击“PUBLISH”公布生成款式ID,款式ID是惟一ID,一旦公布失效不会变动。 二、 各平台代码实现步骤地图服务提供两种办法设置自定义地图款式: • 设置款式文件:通过嵌入JSON款式申明文件手动定义地图款式的更改。 • 设置款式ID:在Petal Maps Studio上创立新款式,或导入现有款式定义。款式一旦公布,应用此款式的利用都会主动利用新款式,不须要更新版本。 1. 第一种办法:设置款式文件新建款式文件mapstyle_road.json [ { "mapFeature": "road.highway.city", "options": "all", "paint": { "color": "#7569ce" } }, { "mapFeature": "road.highway.country", "options": "all", "paint": { "color": "#7271c6" } }, { "mapFeature": "road.province", "options": "all", "paint": { "color": "#6c6ae2" } }, { "mapFeature": "road.city-arterial", "options": "geometry.fill", "paint": { "color": "#be9bca" } }, { "mapFeature": "transit.railway", "options": "all", "paint": { "color": "#b2e6b2" } }]1.1 Android设置款式文件(1)在res/raw目录下增加JSON文件 mapstyle_road.json ...

May 30, 2022 · 2 min · jiezi

关于android:安卓存储栈

安卓软件栈 framework层StorageManager frameworks/base/core/java/android/os/storage/StorageManager.javajava libcore有个java.io.file在门路: libcore/ojluni/src/main/java/java/io/File.java外面有文件相干操作: public boolean createNewFile() throws IOException { SecurityManager security = System.getSecurityManager(); if (security != null) security.checkWrite(path); if (isInvalid()) { throw new IOException("Invalid file path"); } return fs.createFileExclusively(path); }/* -- File operations -- */ // Android-changed: Add method to intercept native method call; BlockGuard support. public boolean createFileExclusively(String path) throws IOException { BlockGuard.getThreadPolicy().onWriteToDisk(); BlockGuard.getVmPolicy().onPathAccess(path); return createFileExclusively0(path); }这里是C语言实现的给java调用的createFileExclusively0 JNI接口: libcore/ojluni/src/main/native/UnixFileSystem_md.c:// Android-changed: Name changed because of added thread policy checkJNIEXPORT jboolean JNICALLJava_java_io_UnixFileSystem_createFileExclusively0(JNIEnv *env, jclass cls, jstring pathname){ jboolean rv = JNI_FALSE; WITH_PLATFORM_STRING(env, pathname, path) { FD fd; /* The root directory always exists */ if (strcmp (path, "/")) { fd = handleOpen(path, O_RDWR | O_CREAT | O_EXCL, 0666); if (fd < 0) { if (errno != EEXIST) JNU_ThrowIOExceptionWithLastError(env, path); } else { if (close(fd) == -1) JNU_ThrowIOExceptionWithLastError(env, path); rv = JNI_TRUE; } } } END_PLATFORM_STRING(env, path); return rv;}libcore/ojluni/src/main/native/io_util_md.c:FDhandleOpen(const char *path, int oflag, int mode) { FD fd; RESTARTABLE(open64(path, oflag, mode), fd); if (fd != -1) { struct stat64 buf64; int result; RESTARTABLE(fstat64(fd, &buf64), result); if (result != -1) { if (S_ISDIR(buf64.st_mode)) { close(fd); errno = EISDIR; fd = -1; } } else { close(fd); fd = -1; } } return fd;}bionic/libc/include/bits/fortify/fcntl.h:__BIONIC_FORTIFY_INLINEint open64(const char* const __pass_object_size pathname, int flags, mode_t modes) __overloadable __clang_warning_if(!__open_modes_useful(flags) && modes, "'open64' " __open_useless_modes_warning) { return open(pathname, flags, modes);}__BIONIC_FORTIFY_INLINEint open(const char* const __pass_object_size pathname, int flags, mode_t modes) __overloadable __clang_warning_if(!__open_modes_useful(flags) && modes, "'open' " __open_useless_modes_warning) { return __open_real(pathname, flags, modes);}int __open_real(const char*, int, ...) __RENAME(open);bionic/libc/include/sys/cdefs.h:#define __RENAME(x) __asm__(#x)/** * readObject is called to restore this filename. * The original separator character is read. If it is different * than the separator character on this system, then the old separator * is replaced by the local separator. */ private synchronized void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException { ObjectInputStream.GetField fields = s.readFields(); String pathField = (String)fields.get("path", null); char sep = s.readChar(); // read the previous separator char if (sep != separatorChar) pathField = pathField.replace(sep, separatorChar); String path = fs.normalize(pathField); UNSAFE.putObject(this, PATH_OFFSET, path); UNSAFE.putIntVolatile(this, PREFIX_LENGTH_OFFSET, fs.prefixLength(path)); } ...

May 29, 2022 · 4 min · jiezi

关于android:独立产品如何获取种子用户

【教你赚钱】获取用户是个问题多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 为啥要获取用户?这个问题问起来仿佛有点多余,然而解释一下也不妨。咱们的终极目标是赚钱,用户就是流量,产品的用户多少间接决定了咱们最终能赚到多少钱。尽管用户多也未必赚钱,然而用户少的话,相应的付费用户或者广告展现次数就必然不会多,最终赚的钱就会很少,甚至会赔本。 因而,获客,是咱们在产品开发上线之后的第一要务,咱们须要尽快地获取种子用户,一方面能够在生产环境测验咱们产品的稳定性,并且依据用户反馈来优化产品性能;另一方面也能够为接下来的产品变现以及用户规模的扩充打下基础。 当咱们通过种子用户优化了产品,进步了稳定性之后,咱们的产品就在利用商店中有了一席之地。依据笔者的教训,当产品在Google Play有了500+下载之后,就能够在商店中被一些关键词搜寻到了,而后咱们通过一直地优化产品,优化商店转化率,进步利用评分等操作,就能够逐渐地进步产品的关键字排名,甚至能够让产品在商店榜单中高歌猛进。在这个过程中,咱们的产品就会逐步的有天然量用户进入,用户增长进入一个正向的滚雪球模式。 笔者的教训是上架Google Play的利用,下载量在500+、10k+、50k+这几个量级会有显著不同的体现。500+是一个门槛,如果咱们的利用达不到这个门槛,那么就能够发表为一个失败的产品,因为这意味着利用对用户毫无吸引力。10k+的利用则阐明产品有了肯定的用户根底,在商店里有稳固的曝光,能够有较稳固的天然量用户,这个时候咱们的各种变现操作才会有意义。50k+则阐明咱们的产品取得了初步的胜利,曾经是一款值得长期保护的产品,此时产品的收益应该是稳定增长的,咱们要持续做的就是扩充战果,让收益最大化。 含辛茹苦利用开发上线了,然而下载量寥寥无几怎么办酒香也怕巷子深,咱们的产品刚上线,在商店外面下载量可能是寥寥的个位数,在这个时候指望用户能通过商店搜寻找到咱们的产品,简直等于白日做梦。因为像Google Play这样曾经经营多年的利用商店,外面的利用以亿万计,只有是比拟火的关键字,都能搜出一堆下载量几百万几千万的大产品,而一个关键词,咱们的产品排名十几名或者几十名以外,那么毫无疑问靠用户天然搜寻来获客十分艰巨。 这里其实就会有一个悖论,热门关键词竞争强烈,冷门关键词尽管没啥竞争然而天生没有几个用户关注,所以找到一个竞争不算强烈然而又潜在用户较多的赛道就显得十分可贵。 既然靠天然获客在产品冷启动的时候并不靠谱,咱们就须要思考用一些经营伎俩来获客了,哪怕是付费获客,咱们也要走出产品问世的要害一步。 产品推广的几个姿态天然量利用自身自带热点或者和某些热点强关联,比方世界杯,比方足球,比方元宇宙,比方NFT,那么这些利用在商店里就有更大的概率曝光,被感兴趣的用户搜寻到,从而获取天然量。然而通常较大的热点也意味着较大的竞争,毕竟热点之所以是热点,就是因为有大部分人的关注,这是一把双刃剑。 如果你能发掘出竞争较少的热点,那就等于是胜利了一半,因而提前布局就显得较为要害。 再有就是当咱们的产品有了肯定的规模,在性能相干的关键字搜寻后果排名靠前,那么也会带来相当可观的天然量用户。所以利用上架之后,优化商店排名以及进步商店详情转化率就是咱们要继续去做的一件事件,包含但不限于:进步利用下载量、进步利用评分、经营利用评估等。 付费获客这一条顾名思义就是花钱去做广告获取用户,也是笔者较为罕用的一个产品冷启动获取用户的办法,利用Google Ads平台,投放利用装置广告,通常能较为疾速地获取第一批用户,这对利用稳定性的验证以及后续商店ASO都有较大的帮忙。 笔者的教训通常是定向在印度和孟加拉国等国家投放英文广告,因为这些国家的客单价较低,通常能够用两毛左右的价格买到一个激活用户,对于产品晚期疾速积攒下载量以及验证稳定性有较大的帮忙。在22年初Google Play评分零碎依据国家更改展现之前,这些用户还能为咱们带来肯定的高分评估。对咱们产品后续的商店曝光晋升以及吸引天然用户都有较大的收益。 促销流动这一条局限性较大,只能用于付费下载利用,Google Play容许开发者每隔30天发动一次促销流动,如果你是付费用户,能够在流动期间将利用打折发售,甚至能够打骨折让用户收费下载,通常在这期间利用会有不错的下载量。一些三方网站也会瞄准打折促销的利用,在本人的网站来作为福利吸引用户,变相地为咱们带来一些流量。 当然促销流动也不全是益处,相应的也会给咱们的产品带来盗版问题。因为促销流动,所以很多三方网站就能够收费取得咱们的利用安装包,很多一些规模不大的网站就会把咱们的安装包提供给用户下载,笔者就日常会在统计平台看到一些盗版用户的激活数据,也尝试过来利用Google Play提供的Integrity API来躲避盗版,只是整体应用下来成果较差,会影响到失常付费用户的应用,所以目前的做法就是会定期更新咱们的产品,并且在利用外面减少最低版本判断,来倡议用户降级到正版产品应用。 自有产品矩阵导量这一条适宜比拟成熟的开发者或者组织,外部曾经有多款利用,那么能够做一些利用之间相互导流的工作,当然在Google Play平台,须要为导量的利用(两个利用性能之间无显著关联)减少广告标识,否则可能会被判利用违规。笔者就因为未标明广告标识而造成Google Play更新审核不通过,甚至导致产品下架。 笔者目前的导流做法是,一款收费产品,提供根底性能来获取用户,变现形式是退出大量的利用内广告。如果用户想体验进阶的性能或者去除广告,咱们会在收费产品内提供疏导,让用户去付费下载Pro版本。这样做的益处是用户能够收费体验局部产品性能,在应用称心之后再去付费下载性能更好的版本,能够无效进步付费产品的整体转化。 当然在这个过程中,咱们的收费产品也要足够吸引用户,否则用户就更加不会为付费产品买单了。在笔者之前产品A的实际中,收费用户到付费用户的整体转化率在10%左右,这个比例如果是收费版本规模较大的话,支出还是会比拟可观的。 欢送关注不迷路,更多独立开发干货公众号(A曙光独立开发站)首发

May 28, 2022 · 1 min · jiezi

关于android:HMS-Core-Discovery第15期回顾长文构筑立体世界共造沉浸式营销

本期直播,咱们邀请到厦门大学信息学院副教授、B站会员购AR专家、蚂蚁特工创始人和HMS Core AR Engine技术专家一起探讨AR技术如何帮忙企业打造沉迷式市场营销,引领商业化改革,同时为大家展现HMS Core AR Engine的翻新技术和利用场景。上面咱们一起来看看本次直播的精彩内容吧! 【亮点直击】1、 案例分享:2D图像跟踪技术如何打造沉迷式营销。 2、 深度解读:厦大传授分享虚拟现实中的交互体验。 3、 凝望将来:虚拟现实与加强事实技术的演进趋势。 【专家观点】 Zhang,华为AR技术专家 “AR技术,一方面提供了低成本试错的条件,有助于降低生产、物流老本,缩小节约;一方面也能够帮忙人们更容易了解事实世界与彼此,晋升沟通效率,AR营销实际上就是通过AR技术来拉近品牌和消费者的间隔。” 郭诗辉,厦门大学信息学院副教授 “AR硬件的遍及会重塑硬件设施的生态体系,AR眼镜无望代替智能手机成为下一代智能终端设备。相较智能手机,AR眼镜能提供更多的性能,比方用户能够眼镜直观看到打车间隔、交通状况、餐厅的动静画面和更多信息,解放咱们的双手。” Sol,B站会员购AR专家 “咱们当初越来越能感知到AR技术在加强用户体验、拉近与用户的间隔的魔力,也缓缓意识到AR或者真的可能成为下一代支流的根底交换工具,AR的春天可能真的要来了。” 林志坚,蚂蚁特工(厦门)科技有限公司创始人 “对于品牌来说,AR技术为品牌建设与消费者之间的趣味互动体验,也为品牌营销带来了有限可能。利用AR技术助力品牌新时代下的全面降级。” 【精彩答疑】Q1:AR的行业背景与市场倒退空间是怎么的? 现如今AR技术受到人们日益宽泛的关注,每个行业在新的技术浪潮下都领有十分大的时机跟挑战。对于品牌来说,通过AR技术进行营销已是不争的趋势。一方面AR技术提供了低成本试错的条件,有助于降低生产、物流老本,缩小节约;一方面也能够帮忙人们更容易了解事实世界与彼此,晋升沟通效率。数据表明,75%的头部品牌打算到2023年将会沿用到AR技术, AR技术为品牌建设与生产之间的趣味互动体验,也为品牌营销带来了有限可能。 Q2:HMS Core AR Engine如何助力打造沉迷式营销? Bilibili会员购利用HMS Core AR Engine能力, HMS Core AR Engine通过辨认和跟踪环境中2D图像的地位、方向和尺寸,能实时输入卡牌的图像姿势,进⾏相干图像增强操作,使购物者在选购时可能浏览商品的AR特效,多角度、近距离地与IP衍生商品实现互动,从而取得更加乏味的身临其境的营销体验。 Q3:HMS Core AR Engine 有哪些劣势技术点? 1.端云协同2D图像跟踪技术:在晋升云端服务的响应速度方面,端云协同2D图像跟踪技术利用硬件平台减速,开发了软硬协同的高性能向量检索引擎,实现海量特色下的毫秒级检索响应。 2.端云协同3D物体实时跟踪技术:AR Engine联合海量的离线数据和反抗生成策略,设计了训练样本的AI合成算法,可能免人工标注,仅依赖合成样本就能够实现简单场景下3D物体的精准辨认。 3.高精度SLAM技术:通过SLAM技术来建设了一个长期世界坐标系,并且获取设施本身在这个坐标系中的地位和姿势,以及虚构物体在这个坐标系中的地位和姿势,从而在渲染的时候,看起来虚构物体就像真的搁置到了真实世界,并且具备几何一致性。 Q4:AR技术如何引领商业划时代的改革? AR硬件的遍及会重塑智能硬件的生态,解放人们的双手。 AR眼镜的到来可能会完结智能手机的时代,在智能眼镜的利用中,人们的衣食住行不会变动,然而在AR的状态会有新的出现形式 ,比方在商场中对于餐馆的抉择,通过智能眼镜消费者就能够迅速失去间隔、3D图像、优惠、评估等信息帮忙其疾速决策,而不必通过手机进行点击搜寻。 Q5:AR技术对于各行业的发展趋势有什么影响? 基于目前AR相干的软硬技术的一直成熟,将来会有更人性化的硬件、更加适配AR新终端的操作系统,这些都对人们生存的方方面面产生影响:对于品牌类营销,在AR技术的驱动下,品牌与消费者的互动都是直观活泼的交互,而不再只是凉飕飕的文字跟图片;对于文化游览来说,观光式的游览会升级成体验式的游览,间接穿梭工夫跟空间的间隔去理解景区或文化;对于工业来说,AR能够在智能巡检跟培训上起到很大的作用,降低成本跟错误率。 如果你还想回顾更多直播精彩霎时,欢送登录华为开发者学堂查看直播回放 欢送登录HMS Core AR Engine理解更多技术细节。 登录华为开发者联盟官网理解更多HMS Core凋谢能力 欢送关注将来更多Discovery直播 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee ...

May 28, 2022 · 1 min · jiezi

关于android:一起看-IO-Google-TV-和-Android-TV-OS-的最新进展

在接触到的娱乐内容一劳永逸的明天,有钻研表明,三分之一的美国家庭现每周的电视观看时长在 25 个小时以上。随着电视体验的一直演进,咱们也为本人设定了一个指标,那就是为用户打造量身定做的电视应用体验,让他们能够轻松获取青睐的娱乐内容。 咱们非常看好 Android TV OS 的发展前景,目前搭载该操作系统的月活设施已达 1.1 亿台,包含数百万台 Google TV。Android TV 和 Google TV 在世界各地的 300 多家合作伙伴处均有销售,其中包含十大智能电视原始设施制造商 (OEM) 中的 7 家以及 170 多家付费电视运营商。另外,得益于咱们开发者社区的辛勤付出,目前电视上的可用利用已达 1 万余款,并且还在日益增多。观看 Google TV 和 Android TV OS 最新进展 视频理解更多详情。 自去年的 I/O 大会以来,咱们始终致力于让您可能在 Android TV OS 上构建更好、更具吸引力的体验。除平台更新以外,新性能 (例如与 Live 标签页的扩大集成) 可便于用户更好地与您的内容互动。如果您还没开始应用 WatchNext API,能够花一些工夫 理解如何将其增加至您的利用,以便用户更容易发现和拜访您的内容。 咱们针对 Android 13 推出的一系列新性能和新工具,将专一于晋升整体性能与品质、改良无障碍性能,并反对多任务处理。 性能与品质 : 为助力构建新一代电视,咱们引入了新的 API,以帮忙您进步开发效率,为用户提供杰出的设施应用体验。AudioManager 让您的利用能够预测音频路线并精确理解可用的播放模式。将您的利用 与 MessiaSession 正确集成,可便于 Android TV 对 HDMI 状态的扭转作出响应,收回暂停内容的信号以节俭电量。无障碍性能 : 为了改善用户与电视的互动形式,咱们在 InputDevice API 中增加了对不同键盘布局的反对。游戏开发者也可依据他们的理论地位援用按键,以反对例如 QWERTZ 和 AZERTY 等实体键盘的不同布局。用户还可通过优先选择全新的零碎级无障碍性能跨利用启用音频形容。多任务处理 : 电视当初不只用于观看媒体内容。事实上,咱们常常看到用户在智能家居中通过电视接听电话或查看摄像头的监控画面。Android 13 能够通过 Android 外围 API 反对已更新的 画中画 API,帮助用户进行多任务处理。电视的画中画性能反对扩大模式 (能够显示同一群组通话中的更多视频画面)、停泊模式 (能够防止在其余利用上叠加内容) 和 keep-clear API(能够在全屏利用中避免叠加层遮蔽重要内容)。 ...

May 27, 2022 · 1 min · jiezi

关于android:升级-Android-认证-远程配置

作者 / 软件工程师 Max Bires 自 Android 8.0 以来,认证成为一项必备性能。随着各个版本的更迭,认证越来越成为各种性能和服务的信赖外围,例如 SafetyNet、身份凭据 (Identity Credential)、数字车钥匙 (Digital Car Key) 以及各种第三方库。因而,当初咱们须要从新扫视认证基础架构,增强信赖链的安全性,并在呈现已知破绽时进步设施信赖的可恢复性。 自 Android 12.0 起,咱们将提供一个选项,可将工厂内私钥配置替换为工厂内公钥提取加上带短期证书的 OTA (over-the-air) 证书配置。此计划将在 Android 13.0 中强制施行。咱们将其称为近程密钥配置 (Remote Key Provisioning)。 哪些群体会受到此办法的影响?原始设施制造商 (OEM) / 原始设计制造商 (ODM)设施制造商将不再间接向工厂中的设施提供认证私钥,从而解除了必须在工厂中治理认证密钥的累赘。 潜在的依赖方咱们将在下文中进一步阐明认证中证书链的格局、算法和长度将产生的变动。如果依赖方在设置其证书验证代码时,要求该代码必须与旧证书链构造有极高的匹配度,则须要更新此代码。 为什么要扭转?咱们扭转向设施提供认证证书的形式有两大动机因素: 容许设施在受到攻打后复原,以及收紧认证供应链。在现在的认证计划中,如果发现某个设施型号受到的攻打会对认证的信赖信号产生影响,或者如果密钥经某种机制泄露,则必须吊销该密钥。因为依赖认证密钥信号的服务越来越多,这一动作可能会对设施受到影响的消费者产生微小的冲击。 如果设施曾经在运行被攻破的软件,这项措施能够使咱们进行对该设施进行密钥配置,并打消密钥意外泄露的可能性。这将大大减少用户服务中断的可能性。 如何运作?每台设施都会生成一个惟一的动态密钥对,该密钥对的公共局部由 OEM 在其工厂中提取。随后,这些公钥将被上传到 Google 服务器,用作之后产生的配置的信赖根底。私钥则永远不会来到生成它的平安环境。 当设施启用并连贯到互联网时,它会为其已生成的密钥生成证书签名申请,并应用与工厂内收集的公钥对应的私钥对其进行签名。后端服务器将验证申请的真实性,而后签订公钥,返回证书链。而后,密钥库会存储这些证书链,并在申请认证时随时调配给利用。 此流程将在证书到期或以后密钥供给用尽时定期执行。该计划反对隐衷爱护,每个利用将接管到不同的认证密钥,并且密钥自身会定期轮换。此外,Google 后端服务器也进行了分段解决,因而验证设施公钥的服务器看不到附加的认证密钥。这意味着 Google 无奈将认证密钥关联回申请它们的特定设施。 从技术角度来看,产生了哪些变动?终端用户不会留神到任何变动。应用认证的开发者则须要留神以下变动: 证书链构造 鉴于新版在线配置基础架构的性质,链长度比以前更长,并且可能会发生变化。信赖根 信赖根最终将从目前的 RSA 密钥更新为 ECDSA 密钥。弃用 RSA 认证 KeyMint 生成和认证的所有密钥都将应用 ECDSA 密钥和对应的证书链进行签名。而在以前,非对称密钥由各自对应的算法进行签名。短期证书和认证密钥 为设施配置的证书在到期和轮换之前通常领有最多两个月的有效期。欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!

May 27, 2022 · 1 min · jiezi

关于android:Android-OTA升级二之otafromtargetfiles文件分析

转载概要此局部为全包降级次要实现过程,波及到ota_from_target_files 文件,这个也是制作全包和差分包的次要工具,接下来咱们就着重剖析怎么利用这个工具制作full_ota_package的。 次要流程 源码剖析上节中 Makefile 中 otapackage 指标最初的 cmd 为: $(hide) MTK_SECURITY_SW_SUPPORT=$(MTK_SECURITY_SW_SUPPORT)MKBOOTIMG=$(MKBOOTIMG) \ ./build/tools/releasetools/ota_from_target_files-v \ --block \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ $(if $(OEM_OTA_CONFIG), -o$(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@所以跳到 ota_from_target_files python 文件中,接下来咱们先看一下这个文件的作用,usage 以及 cmd 所带的参数的意义。 """Given a target-files zipfile, produces an OTA package that installsthat build. An incremental OTA is produced if -i is given, otherwisea full OTA is produced.Usage: ota_from_target_files [flags] input_target_files output_ota_package --board_config <file> Deprecated. -k (--package_key) <key> Key to use to sign the package (default isthe value of default_system_dev_certificate from the inputtarget-files's META/misc_info.txt, or "build/target/product/security/testkey" if that value is notspecified). For incremental OTAs, the default value is based on the sourcetarget-file, not the target build. -i (--incremental_from) <file> Generate an incremental OTA using the given target-files zip asthe starting build. -v (--verify) Remount and verify the checksums of the files written to thesystem and vendor (if used) partitions. Incremental builds only. -o (--oem_settings) <file> Use the file to specify the expected OEM-specific propertieson the OEM partition of the intended device. -w (--wipe_user_data) Generate an OTA package that will wipe the user data partitionwhen installed. -n (--no_prereq) Omit the timestamp prereq check normally included at the top ofthe build scripts (used for developer OTA packages whichlegitimately need to go back and forth). -e (--extra_script) <file> Insert the contents of file at the end of the update script. -r (--preloader) <file> Specify 'preloader.img' to upgrade. -l (--logo) <file> Specify 'logo.img' to upgrade. -u (--uboot) <file> Specify 'uboot.img/lk.img' to upgrade. -a (--aslr_mode) <on|off> Specify whether to turn on ASLR for the package (on by default). -2 (--two_step) Generate a 'two-step' OTA package, where recovery is updatedfirst, so that any changes made to the system partition are doneusing the new recovery (new kernel, etc.). --block Generate a block-based OTA if possible. Will fall back to afile-based OTA if the target_files is older and doesn't supportblock-based OTAs. -b (--binary) <file> Use the given binary as the update-binary in the output package,instead of the binary in the build's target_files. Use fordevelopment only. -t (--worker_threads) <int> Specifies the number of worker-threads that will be used whengenerating patches for incremental updates (defaults to 3). -f (--special_factory_reset) After upgrade, it will execute special factory reset. -z (--trustonic) <file> Specify 'mobicore.bin' to upgrade."""文件的作用如英文形容:给出一个 target_file 的 zip 包生成一个 ota 包,如果带 –i 参数则生成差分包,否则生成 full_ota_package ...

May 27, 2022 · 10 min · jiezi

关于android:Android-OTA升级一之Makefile文件分析

转载概要:此篇文章次要介绍 Android ota 包(Android L)的编译制作过程,侧重于 Makefile 中编译 ota 的流程,从指定 target 到编译 cmd 等流程。 次要流程: 源码剖析:build/core/Makefile: .PHONY: otapackageotapackage: $(INTERNAL_OTA_PACKAGE_TARGET)otapackage 伪命令,即执行 make otapackage 时,将编译$(INTERNAL_OTA_PACKAGE_TARGET)指标 $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) @echo "Package OTA: $@"ifneq ($(TARGET_USERIMAGES_USE_UBIFS),true) ifeq (yes, $(filter $(TRUSTONIC_TEE_SUPPORT) $(MTK_ATF_SUPPORT),yes)) $(hide) MTK_SECURITY_SW_SUPPORT=$(MTK_SECURITY_SW_SUPPORT) MKBOOTIMG=$(MKBOOTIMG) \ ./build/tools/releasetools/ota_from_target_files -v \ --block \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ -z $(PRODUCT_OUT)/trustzone.bin \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ else $(hide) MTK_SECURITY_SW_SUPPORT=$(MTK_SECURITY_SW_SUPPORT) MKBOOTIMG=$(MKBOOTIMG) \ ./build/tools/releasetools/ota_from_target_files -v \ --block \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ endifelse $(hide) MTK_SECURITY_SW_SUPPORT=$(MTK_SECURITY_SW_SUPPORT) ./build/tools/releasetools/ota_from_target_files -v \ -n \ -g \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ $(BUILT_TARGET_FILES_PACKAGE) $@endififeq ($(strip $(MTK_FW_UPGRADE)), yes)# @echo "Package FWUpgradePackage"# bash $(FWUPGRADEPACKAGE_SH) $(PRODUCT_OUT) $(KEY_CERT_PAIR)endif依赖两局部: ...

May 27, 2022 · 7 min · jiezi

关于android:HMS-Core机器学习服务高效助力跨语种沟通

5月24日, HUAWEI Developer Day(简称HDD)线上沙龙·翻新开发专场流动胜利举办。HMS Core机器学习服务(ML Kit)产品经理在会上围绕机器翻译的技术劣势、应用场景和接入领导等为开发者们做了具体解读。ML Kit将助力开发者更快更好地开发翻译类利用,帮忙用户轻松逾越语种阻碍。 近年来,以机器学习为代表的人工智能技术疾速融入生产生存场景,推动科技更好地服务于人。机器翻译作为人工智能关键技术之一,越来越受到人们的关注。随着国内企业、利用出海减速,机器翻译作为无效加强全球化信息的能力,通过对文本、图片、语音、文档的翻译,在开辟海内市场、晋升客户体验、获取海内洞察、反对公司策略等利用场景下都将为企业赋能。 丰盛的利用场景,为用户体验精益求精ML Kit的文本翻译能力是以机器学习、大数据、自然语言和云计算等前沿技术为根底打造的主动翻译服务,它提供了丰盛多样的应用场景,解决了用户因为语言不通而导致交换不畅的痛点。比方通话场景下说中文,实时语音辨认后,文本翻译能力能够疾速将辨认的文字转化为指标语言文字;浏览场景下,反对提词翻译器性能,帮忙用户快捷看到译文;视频类App集成文本翻译服务后,用户能够体验AI实时字幕性能。该服务还能够利用到相机AR视频中,将拍摄到的文字实时翻译成多语种。 借助于HMS Core平台以及华为AI技术的劣势,ML Kit文本翻译能力在罕用语种、罕用垂域有显著劣势,尤其在新闻、出行、科技、字幕等畛域或场景下,通过模型重构与优化,ML Kit的翻译会更加精确天然。 中文直译零碎,助力国内企业出海与目前大多数以英文为枢纽的翻译零碎不同, ML Kit正踊跃打造中文直译的翻译零碎。通过多年的语料积攒,文本翻译能力交融了大量专业术语、俚语、网络热词等,同时使用课程学习技术加强垂域的翻译成果,并由语言专家审核后构建中文平行语料,打造出ML Kit差异化竞争力,更好地服务中文使用者出海以及海内CP进入中国市场。 另外,ML Kit文本翻译服务基于华为诺亚方舟实验室推出的bolt深度学习减速库,通过对原有Transformer解码层自定义算子的适配,从而实现了对模型的量化剪裁,晋升了模型的推理速度。 同声传译行将上线,保障沟通实时性在面对畛域多样、需要简单、实时性高的会议、直播场景时,传统的文本翻译无奈满足同声传译高实时性的需要,基于此,ML Kit行将上线全面高效的机器同传解决方案。 实际上,同声传译就是通过汇聚ML Kit中的时语音辨认、翻译、语音合成的能力, 将音频实时翻译为不同语种,并输入多语种的音频内容,从而均衡了时延与准确度,实现多语种低成本的无效交换。开发者们能够继续关注华为开发者联盟官网>HMS Core机器学习服务,待上线后即可体验同传成果。 无需简单代码,开发者即可通过ML Kit的SDK疾速应用AI能力。同时,开发者能够依据理论利用需要训练,生成自定义化的AI模型,全方位满足各个领域的翻新利用。随着人工智能和深度学习技术的精进,将来,HMS Core ML Kit的翻译性能将会更弱小。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 27, 2022 · 1 min · jiezi

关于android:HDD线上沙龙创新开发专场多元服务融合助力应用创新开发

5月24日,由华为开发者联盟主办的HUAWEI Developer Day(华为开发者日,简称HDD)线上沙龙·翻新开发专场在华为开发者学堂及各大直播平台与宽广开发者见面。直播内容次要聚焦HarmonyOS和HMS生态利用开发,带来对于HarmonyOS服务卡片、HMS Core凋谢能力、利用高效开发解决方案、国产游戏引擎Cocos Creator等前沿产品亮点和技术更新,为开发者提供更多高效的开发能力,让开发者更加专一于利用翻新。 玩转HarmonyOS,服务卡片让科技生存更便捷HarmonyOS 2.0公布以来,服务卡片应用累计50亿次,用户使用率达70%,目前卡片式界面展现模式曾经成为APP设计的新趋势。开发者能够通过HarmonyOS服务卡片将利用/服务的重要信息或操作前置到卡片,以达到服务中转,缩小体验层级的目标。 具体来看,服务卡片具备好看、便捷好用,承载情感寄托等特质,反对手机、平板、大屏、车机、穿戴等智能终端设备,反对扫一扫、碰一碰、说一说三类入口,用户能够通过HarmonyOS码、设施NFC以及智慧语音对服务卡片进行操控。对开发者而言,服务卡片无疑是改善APP用户体验的无效办法。 线上HarmonyOS相干专家还展现了通过IDE工具DevEco Studio高效开发服务卡片的全过程,具体开发流程您能够在【华为开发者联盟学堂】观看直播回放进一步理解。 与HMS Core独特打造更受用户青睐的AI利用这是一个AI利用的时代,人工智能曾经在人不知;鬼不觉间渗透到教育、出行、娱乐、办公等诸多畛域场景中,且在一直刷新催生全新的生存形式。此次HMS Core相干专家分享了HMS Core机器学习服务(ML Kit)和HUAWEI HiAI Foundation的凋谢能力,帮忙开发者在具体行业场景中实际AI技术,把握利用开发所须要的AI能力,从而为利用带来更多的AI新性能。 ML Kit能够为开发者提供简略易用、服务多样化的AI能力,包含文本类、语音语言类、图像类、人脸人体类和自定义模型AI服务。文本翻译是ML Kit泛滥AI能力中的一个,ML Kit翻译服务可提供邮件翻译、通话翻译、浏览翻译、实时语音翻译、AR翻译等丰盛多样的应用场景,解决用户因为语言不通而导致交换不畅的痛点。 ML Kit文本翻译服务反对端云协同,云侧能力反对更广的垂域覆,以及反对更多的语种,同时依靠华为寰球云服务站点的布局,实现了200毫秒以内便能够实现300字节文本的翻译速度。端侧能力集成简略,无需网络即可实现离线翻译,开发者能够依据须要自由选择应用不同的语言包。 HMS Core相干专家首次展现了已在华为外部深度应用的同声传译计划,即通过ML Kit的实时语音辨认、机器翻译、语音合成等能力, 将音频实时翻译为不同语种,并输入多语种的音频内容,从而均衡了时延与准确度,实现多语种低成本的无效交换,具备低延时、准确率、声音可定制等劣势,同声传译计划通过一年多的打磨,行将正式推出。 HUAWEI HiAI Foundation作为华为AI计算能力开放平台,助力开发者在NPU硬件加速下取得更好的AI利用凋谢体验,为开发者提供了300多个具备业界优质模型兼容性的AI算子,推出端云协同、Model Zoo、模型量化工具包、网络结构搜寻工具包、多IP深度协同等多种解决方案和能力,通过更易用的工具链、更好的性能以及更低的功耗解决方案,帮忙开发者疾速部署AI利用,节俭计算资源,进步开发效率。 HUAWEI HiAI Foundation反对端侧AI泛滥业务场景,其中端侧视频场景对实时性功耗要求很高,如端侧视频超分能力即须要高性能实时处理、也须要通过底层硬件来降低功耗放弃续航。 作为端侧AI计算的平台底座,HUAWEI HiAI Foundation能疾速将原始模型转换成华为Davinci Model,并通过Davinci Model的调优技术,优化模型构造,充分发挥NPU硬件单元的算力,让模型以更低功耗在手机端侧高效运行,用户能够取得更好的视频画质体验,视频平台能够节俭带宽和服务器资源,开发者则可能高效集成业务、升高工作量。目前,HUAWEI HiAI Foundation曾经胜利助力华为视频、爱奇艺、优酷等多个视频平台在端侧部署视频超分技术。 降本增效实战利器:Serverless构建服务针对利用开发阶段,开发者可能面临云资源节约、认证形式繁琐、网站部署环节多、性能开发周期长等问题,此次华为开发者联盟为开发者推出了“利用高效开发解决方案”,帮忙宽广开发者对立构建主动弹性伸缩能力,实现降本增效。 具体来看,开发者能够通过云函数、云数据库、云存储疾速构建利用,主动弹性伸缩资源老本可升高75%,利用开发效率可晋升70%;认证服务、云函数可为利用疾速构建安全可靠的用户认证零碎,某利用集成了认证服务,服务端缩小了80%的工作量,客户端缩小了40%的工作量;云托管反对网站一键托管免运维,能够让人工部署网站效率晋升20倍;Serverless场景模板具备疾速集成、上线,免运维的特质,基于丰盛的场景模板构建利用,效率能够晋升98.6%。(数据源自华为开发者联盟和开发者反馈) Cocos赋能高效游戏研发,拓宽利用生态边界Cocos Creator作为寰球风行的 2D&3D 游戏引擎,与华为开发者联盟在技术、服务、生态等多个维度都有深刻单干,全方位赋能开发者。 技术层面上,Cocos 不仅是寰球首个反对 HarmonyOS 的图形渲染引擎,同时目前也曾经实现了Open Harmony的平台适配。此外,Cocos 还通过集成HMS Core CG Kit,开发实现了提早渲染管线,帮忙开发者在华为平台上制作画面更加优良的游戏。 服务层面上,Cocos 基于挪动端游戏曾经开发实现包含华为帐号、领取、广告等服务的接入,近期还将反对推送、剖析和定位等服务能力,开发者能够通过 Cocos Creator 一键接入HMS Core,将现有游戏内容无缝上传至 HUAWEI AppGallery Connect ,并疾速公布到华为利用市场,极大晋升游戏开发效率。 ...

May 27, 2022 · 1 min · jiezi

关于android:二维码污损反光距离远还能扫出来吗统一扫码服务告诉你能

二维码和条形码从创造到倒退曾经过来了几十年,因其能快捷不便读取信息的特点,在数字经济时代被广泛应用。扫描二维码能够辨认健康状况,辨认身份信息、拜访网站链接、实现金融领取等等,曾经成为生存中不可或缺的实用技术,所以很多App都搭载了“扫一扫”性能。 然而,在日常扫码过程中,咱们也常常会遇到扫码环境暗、二维码污损、含糊等状况,导致辨认二维码艰难。HMS Core 对立扫码服务(Scan Kit)为常见简单扫码场景(如反光、暗光、污损、含糊、柱面)做了针对性辨认优化,还能实现远距离码或小型码的检测和主动放大,晋升扫码成功率与用户体验。 1. 远距离扫码一般的二维码扫描器只读间隔不超过30厘米,然而咱们生存中经常出现远距离扫码的状况,例如停车场远距离扫码缴费、公众场合扫码签到等,一般的扫码服务在这时候就会呈现扫码艰难的状况。对立扫码服务,因为在扫码解决流程中多了一个预检测的性能,即便是肉眼无奈分辨,也能够很好的主动放大超远距离的二维码。 2. 二维码污损二维码污损也是户在日常扫码中常常遇到的状况,比方扫码骑行时遇到二维码破损,扫描纸质二维码因为纸张破损二维码不残缺的状况也常有呈现,对立扫码服务基于多项计算机视觉技术,能够大幅晋升简单场景识别率。 当然,HMS Core 对立扫码服务除了反对污损二维码扫描,遇到反光,暗光等场景,甚至将二维码贴在商品上时呈现曲面或棱角的状况,也能胜利扫码;哪怕你边走动边扫码,此时的二维码模糊不清也不影响扫码的准确率。 3. 多码辨认在仓库盘点、收发货物时,经常遇到摆满了货物,下面都贴上条形码的状况,如果工人一个个扫码盘点,效率非常低。多码辨认能够帮忙仓库盘点,快递收发等场景实现一次辨认多个码,晋升业务解决效率。多码识别模式下,Scan Kit一次最多能够同时辨认不限品种的5个码。 4. 多角度扫码有时因为环境的限度,咱们不肯定能扫到侧面角度的二维码, 对立扫码服务基于自动检测及旋转纠正能力,辨认区域更宽(侧面和侧面+45°),反对用户从任意角度扫码,可主动校对疾速辨认二维码,即便地位不不便也能正确辨认,从而晋升利用扫码灵便度和识别率。 开发步骤对立扫码服务提供多元的接入形式,起码5行代码即可领有弱小的扫码能力,开发者能够间接应用Scan Kit提供的默认扫码页面,也能够基于Scan Kit提供的示例代码,疾速自定义扫码性能。以下我会以Default View Mode为例,展现具体的集成步骤。 开发前筹备在我的项目级”setting.gradle”中配置HMS Core maven仓地址pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() // 配置HMS Core SDK的Maven仓地址。 maven { url 'https://developer.huawei.com/repo/' } }}dependencyResolutionManagement { ... repositories { google() mavenCentral() // 配置HMS Core SDK的Maven仓地址。 maven { url 'https://developer.huawei.com/repo/' } }}2.在利用级的build.gradle上增加编译依赖 dependencies{ implementation 'com.huawei.hms:scanplus:2.4.0.302' }配置混同脚本-ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.**{*;} -keep class com.huawei.**{*;}在“AndroidManifest.xml”中指定相机权限和文件读取权限,并动静申请权限<!--相机权限--> <uses-permission android:name="android.permission.CAMERA" /> <!--读文件权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> // CAMERA_REQ_CODE为用户自定义,用于接管权限校验后果的申请码。this.requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_REQ_CODE);校验是否开启相应的权限,决定是否持续扫码。// 实现“onRequestPermissionsResult”函数接管校验权限后果。final int PERMISSIONS_LENGTH = 2;@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 判断“requestCode”是否为申请权限时设置申请码CAMERA_REQ_CODE,而后校验权限开启状态。 if (requestCode == CAMERA_REQ_CODE && grantResults.length == PERMISSIONS_LENGTH && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { // 调用扫码接口,构建扫码能力。 ... }}构建扫码性能依据理论需要创立扫码选项参数。// “QRCODE_SCAN_TYPE”和“DATAMATRIX_SCAN_TYPE”示意只扫描QR和Data Matrix的码HmsScanAnalyzerOptions options = new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).create();调用ScanUtil的静态方法startScan启动Default View扫码页面。用户能够应用相机扫码,也能够通过该页面的“导入图片”按钮检测图片中的码。ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, options);实现回调接口接管扫码后果,相机扫码和导入图片扫码均通过该接口返回。@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK || data == null) { return; } if (requestCode == REQUEST_CODE_SCAN_ONE) { // 导入图片扫描返回后果 HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT); if (obj != null) { // 展现解码后果 showResult(obj); } }}理解更多详情>> ...

May 27, 2022 · 1 min · jiezi

关于android:一图读懂HUAWEI-HiAI-Foundation

作为华为端侧AI的翻新开放平台,HMS Core的HUAWEI HiAI Foundation凋谢AI算力,助力AI利用高效开发,同时联结多畛域打造AI生态,实现日调用600亿次的冲破,助力AI生态凋敝。上面用一张图带你疾速get HUAWEI HiAI Foundation的外围能力~

May 26, 2022 · 1 min · jiezi

关于android:对抗噪音一键清晰HMS-Core音频编辑服务给你录音棚般的体验

短视频时代降临,一部手机就能够玩转多种花色,所以越来越多的自在创作者退出这个行业,平时生存中用手机拍短视频、街头唱歌的非专业从业者随处可见。来到了录音棚,没有业余、对立的录音设施,无论在家里还是在路边、商场等中央,录制的视频带乐音在劫难逃。所以在后期制作中,如何疾速精确地解决噪声至关重要。HMS Core音频编辑服务(Audio Editor Kit)提供降噪性能,一键去除乐音,帮忙创作者轻松制作优质内容。 HMS Core音频编辑服务的降噪性能,反对双麦和单麦降噪,能够对输出音频中的一些常见的准稳态噪声或者突发噪声进行实时处理,并对人声进行修复和加强,晋升语音信号品质。开发者可通过只须要通过简略的集成形式即可让利用获取高质量音频降噪能力,可广泛应用于音视频剪辑、K歌、直播、即时通讯、线上会议等场景。 上面咱们就一起来实操一下如何接入华为音频编辑服务,实现降噪成果吧。 1开发筹备具体筹备步骤可参考华为开发者联盟官网 2编辑工程集成2.1设置利用的鉴权信息开发者须要通过api_key或者Access Token来设置利用鉴权信息。 通过setAccessToken办法设置Access Token,在利用启动时初始化设置 HAEApplication.getInstance().setAccessToken("your access token");通过setApiKey办法设置api_key,在利用启动时初始化设置一次即可,无需屡次设置。 HAEApplication.getInstance().setApiKey("your ApiKey");2.2文件接口调用文件接口实现具体性能,必要条件:创立文件接口回调。 private ChangeSoundCallback callBack = new ChangeSoundCallback() { @Override public void onSuccess(String outAudioPath) { // 解决胜利 } @Override public void onProgress(int progress) { // 进度回调解决 } @Override public void onFail(int errorCode) { // 解决失败 } @Override public void onCancel() { // 勾销解决 }};2.3实现降噪性能 调用applyAudioFile接口进行降噪。 // 降噪HAENoiseReductionFile haeNoiseReductionFile = new HAENoiseReductionFile();// 调用接口haeNoiseReductionFile.applyAudioFile(inAudioPath, outAudioDir, outAudioName, callBack);// 勾销降噪工作haeNoiseReductionFile.cancel();HMS Core音频编辑服务除了反对降噪,还提供根底音频编辑、格局转换、AI配音、音源拆散、空间渲染、变声、音频提取等一站式音频能力,开发者可根据利用场景,在App中轻松实现音频性能的集成。 ...

May 26, 2022 · 1 min · jiezi

关于android:Java并发编程Java内存模型JMM

Java并发编程-Java内存模型(JMM)前言在上一章 Java并发编程-Android的UI框架为什么是单线程的? 中笔者介绍了并发编程线程平安「三大恶」:「可见性」、「原子性」以及「有序性」 狭义上来说,并发编程问题笔者演绎为:是因为后续操作看不到后面操作的后果而引发的 首先「大恶-可见性」顾名思义,即线程B是否看见线程A对共享变量的操作后果 其次「二恶-原子性」CPU 指令/操作被中断/宰割,狭义上看笔者认为也是可见性问题,比方线程 A 批改共享变量 x += 1 时被中断,去执行线程 B x = 40 ,线程 A 复原执行时可能看不到 x 曾经被批改为 40 最初「三恶-有序性」指的是程序依照代码的先后顺序执行,即先执行 x = 40 ,后续读取 x == 40 肯定为真,如果有各种优化导致指令重排序,后续读取 x == 40 时可能不为真 总而言之,并发编程的问题大部分都是「可见性」问题 Java内存模型(JMM)在上一章中笔者介绍了导致「可见性」的起因是缓存,导致「有序性」的起因是各种优化(编译时、处理器以及运行时),首先笔者想到的是禁用缓存和禁止各种优化操作,在 Java 中如何禁用缓存和禁止各种优化呢? Happens-BeforeJava 内存模型是通过各种操作来定义的1,包含对变量的读 / 写操作,监视器锁的加锁和开释操作,以及线程的启动和合并操作。JMM 为程序中所有的操作定义了一个偏序关系2,称之为 Happens-Before。要想保障执行操作 B 的线程看到操作 A 的后果(无论 A 和 B 是否在同一个线程中执行),那么在 A 和 B 之间必须满足 Happens-Before 关系。如果两个操作之间不足 Happens-Before 关系,那么 JVM 能够对它们任意的重排序。 Happens-Before 的规定包含: 规定一:程序程序这条规定比拟合乎咱们的直觉,在单线程中代码的程序即程序的执行程序:int x = 40 将在 int y = 41 之前执行 ...

May 25, 2022 · 2 min · jiezi

关于android:一起看-IO-Compose-for-Wear-OS-Beta-版发布

作者 / Kseniia Shumelchyk, Developer Relations Engineer & John Nichol, Tech Lead of Compose for Wear OS 咱们正式公布了 Compose for Wear OS 的 Beta 版,这是咱们的古代申明式用户界面工具包,旨在帮忙开发者为 Wear OS 构建精美的用户体验。 Compose for Wear OS 减少了为手表优化的组件,这些组件均基于 Wear OS 的最新 Material 设计规范,且建设在外围 Compose 库之上。工具包充沛活用了 Modern Android Development (古代 Android 开发),以减速整体开发过程。 在 Beta 版公布后,Compose for Wear OS 就领有了 1.0 版本 (将于往年晚些时候公布) 所需的残缺性能,且能供您构建生产就绪的利用。这也意味着它的 API 曾经稳固,今后咱们将专一于晋升性能以及针对 1.0 版本持续打磨现有组件。查看 Compose for Wear OS Beta 版公布视频 理解更多详情。 Beta 版本介绍自去年的 I/O 大会以来,咱们始终在致力将 Jetpack Compose 的劣势带到 Wear OS,还通过 Slack 与社区互动,收集开发者对 API、组件和工具的反馈。一些组件也因而失去了改良,如导航、可缩放惰性列表 (scaling lazy list)、输出和手势反对等等。 ...

May 25, 2022 · 2 min · jiezi

关于android:HMS-Core-AR-Engine-2D图片3D物体跟踪技术-助力打造更智能AR交互体验

AR技术曾经被广泛应用于营销、教育、游戏、展览等场景。通过2D图像跟踪技术和3D物体跟踪技术,用户只需应用一台手机进行拍摄,即可实现海报、卡牌等立体物体以及文物、手办等平面物体的AR成果。只管近年来2D图像跟踪和3D物体跟踪算法曾经获得了很大的提高,但受限于环境等因素影响,成果依然有很大晋升空间,是目前AR开发者的研发难点。 HMS Core AR Engine提供了2D图像和3D物体的端云协同跟踪技术,让开发者更简略便捷地开发AR类利用,让用户领有更丰盛的AR交互体验。 2D图像跟踪技术端云协同2D图像实时跟踪技术已率先利用于Bilibili会员购,购物者在选购时可能浏览商品的AR特效,多角度、近距离地与IP衍生商品实现互动,从而取得全新的AR购物体验。据会员购后盾数据统计,具备AR特效的商品销量更好,AR流动参与率是一般游戏参与率的2倍左右,助力会员购平台支出晋升。 图1. Bilibili会员购效果图 传统的纯端侧2D图像跟踪计划,如果开发者要让新的图片反对AR特效就必须更新利用版本,有较高的版本保护老本,而且随着反对AR个性图片的减少,利用的体积也会一直增大。为此,AR Engine采纳端云协同的架构解决该问题,开发者仅需将图片上传到云端即可疾速公布新图片的AR特效,端侧利用版本无需更新,利用体积也不会因而而减少。 图2. 端云协同2D图像跟踪技术原理图 端云协同2D图像跟踪技术次要涵盖了: 云侧图像特征提取模块 云侧向量检索引擎 端侧视觉跟踪模块 在晋升云端服务的响应速度方面,端云协同2D图像跟踪技术利用硬件平台减速,开发了软硬协同的高性能向量检索引擎,实现海量特色下的毫秒级检索响应。 3D物体跟踪技术在文物介绍、商品展现、AR教育等场景,AR Engine还提供了端云协同3D物体实时跟踪技术。该技术可能实现3D物体全息式信息展现成果 图3. 端云协同3D物体实时跟踪技术效果图 现实生活中,会存在不同纹理材质的3D物体,例如雕塑类的纯色弱纹理材质,或者金属器皿类的反光景象,3D物体也会受光线变动导致外表呈现暗影,这些场景都对3D物体跟踪带来很大的挑战。为了实现在各种场景下均能疾速精确的进行辨认跟踪,AR Engine应用多个AI网络组合实现3D辨认定位性能,别离实现对象检测、位姿粗定位、位姿优化。 图4. 端云协同3D物体跟踪技术原理图 端云协同3D物体实时跟踪技术次要涵盖了: 云侧训练样本AI合成模块 云侧AI网络主动训练模块 云侧AI网络推理模块 端侧视觉跟踪模块 在对AI网络进行算法训练时,传统的训练样本人工标注形式,往往存在工作量大、开发周期长等问题。为此,AR Engine联合海量的离线数据和反抗生成策略,设计了训练样本的AI合成算法,可能免人工标注,仅依赖合成样本就能够实现简单场景下3D物体的精准辨认。 端云协同3D物体跟踪技术在文物介绍场景,已助力华为河图为莫高窟实现全息式文旅向导体验,帮忙游客随时探索洞窟的外部细节。 图5. 华为河图的莫高窟全息式文旅向导效果图 以上技术来自华为2012地方媒体技术院,通过AR Engine面向开发者凋谢,在广告营销、教育、文旅等场景为用户带来差异化的AR体验。 更多AR技术的信息,欢送收看5月27日19:00-20:00 HMS Core Discovery第15期直播,让咱们一起摸索HMS Core AR Engine是如何帮忙开发者们构筑平面世界,打造沉迷式营销的服务体验。 欢送拜访华为开发者联盟官网-HMS Core AR Engine 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 25, 2022 · 1 min · jiezi

关于android:View的Detach状态对动画的影响

View的Detach状态对动画的影响起因是在用外部是ViewPager2实现的banner控件时,每个View有浮动的动画成果,在滑动切换后,动画隐没。咱们都晓得ViewPager2的外部是用RecyclerView来实现的,而RecyclerView复用和回收View时会将View增加和移除,第一想法是Detach对动画有影响,在试验过这个想法,开始剖析 切入点startAnimation、dispatchDetachedFromWindow 源码剖析startAnimationpublic void startAnimation(Animation animation) { animation.setStartTime(Animation.START_ON_FIRST_FRAME); setAnimation(animation); invalidateParentCaches(); invalidate(true);}public void setAnimation(Animation animation) { mCurrentAnimation = animation; ...}能够看到只是简略给mCurrentAnimation进行了赋值,其余都是动画相干的设置,而后执行了invalidate,那么动画是怎么被执行的呢?猜想onDraw里必定有猫腻,咱们再看看另一个切入点 dispatchDetachedFromWindowvoid dispatchDetachedFromWindow() { ... onDetachedFromWindowInternal(); ... if (listeners != null && listeners.size() > 0) { ... // 分发给内部回调 for (OnAttachStateChangeListener listener : listeners) { listener.onViewDetachedFromWindow(this); } } ... mAttachInfo = null; if (mOverlay != null) { // 分发给Overlay mOverlay.getOverlayView().dispatchDetachedFromWindow(); } notifyEnterOrExitForAutoFillIfNeeded(false);}protected void onDetachedFromWindowInternal() { ... mCurrentAnimation = null; ...}只是简略的将mCurrentAnimation置为null,onDraw的嫌疑更大了,咱们追踪mCurrentAnimation的usage,发现在boolean draw(Canvas canvas, ViewGroup parent, long drawingTime)中有应用,那也根本确定了咱们的猜想 ...

May 25, 2022 · 1 min · jiezi

关于android:WGCLOUD能监测android安卓设备吗

能 WGCLOUD能够监测安卓设施状态,具体阐明如下链接 https://www.wgstart.com/help/docs63.html

May 25, 2022 · 1 min · jiezi

关于android:View的Attach状态

View的Attach状态切入点addOnAttachStateChangeListener(OnAttachStateChangeListener), 源码剖析追踪onViewAttachedToWindow调用,仅在dispatchAttachedToWindow中被调用。 持续追踪dispatchAttachedToWindow的usage: // View#dispatchAttachedToWindowvoid dispatchAttachedToWindow(AttachInfo info, int visibility) { mAttachInfo = info; if (mOverlay != null) { // 只是散发状态给Overlay mOverlay.getOverlayView().dispatchAttachedToWindow(info, visibility); } ...}// ViewGroup#dispatchAttachedToWindowvoid dispatchAttachedToWindow(AttachInfo info, int visibility) { ... for (int i = 0; i < count; i++) { final View child = children[i]; // 散发状态给子View child.dispatchAttachedToWindow(info, combineVisibility(visibility, child.getVisibility())); } final int transientCount = mTransientIndices == null ? 0 : mTransientIndices.size(); for (int i = 0; i < transientCount; ++i) { // 散发状态给transient view View view = mTransientViews.get(i); view.dispatchAttachedToWindow(info, combineVisibility(visibility, view.getVisibility())); }}// ViewGroup#addTransientViewpublic void addTransientView(View view, int index) { ... // 散发状态给新增加 transient view if (mAttachInfo != null) { view.dispatchAttachedToWindow(mAttachInfo, (mViewFlags & VISIBILITY_MASK)); } ...}// ViewGroup#addViewInnerprivate void addViewInner(View child, int index, LayoutParams params, boolean preventRequestLayout) { ... AttachInfo ai = mAttachInfo; if (ai != null && (mGroupFlags & FLAG_PREVENT_DISPATCH_ATTACHED_TO_WINDOW) == 0) { ... child.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK)); ... } ...}后面几处调用,都是散发状态给外部的一些非凡View,通过addViewInner,咱们能够确认,当View被增加到视图构造档次时,散发Attach状态。 ...

May 25, 2022 · 1 min · jiezi

关于android:一起看-IO-全新-Google-Play-SDK-索引助您为应用选择合适的-SDK

作者 / Yafit Becher, Product Manager & Ray Brusca, Strategic Partnerships Manager 利用开发者依附 SDK 来为他们的利用和游戏整合要害性能和服务。尽管 SDK 是开发中必不可少的构件,但开发者也示意要弄清楚哪些 SDK 是牢靠的、能够平安应用的,可能会很艰难。因而,帮忙宽广开发者在抉择 SDK 时做出理智的决定,对于让 Google Play 成为服务数十亿人的平安、可信赖的平台 而言至关重要。 咱们在 2020 年推出了 Google Play SDK 管理中心,为 SDK 供应商提供解体报告、应用统计,并让他们能够通过 Google Play 管理中心和 Android Studio 与利用开发者沟通关键问题。明天,咱们又迈出了新的一步,推出 Google Play SDK 索引 来深入沟通、晋升透明度,这是一个新的公开站点,收录了 100 多个应用最宽泛的商用 SDK,以及针对每个 SDK 的洞察。 △ Google Play SDK 索引提供了可靠性和安全性数据,让您得以判断某个 SDK 是否适宜您的业务和用户 您能够 间接搜寻某个 SDK,也能够通过类别,如 "广告和盈利" 或者 "数据分析" 来进行查找。对于每个收录的 SDK,Google Play SDK 索引联合了来自 Google Play 利用的应用数据与 SDK 代码检测的后果,以此提供洞察,帮忙您判断一个 SDK 是否适宜您的业务和用户。您能够在索引中看到: ...

May 18, 2022 · 1 min · jiezi

关于android:Java并发编程Android的UI框架为什么是单线程的

前言家喻户晓,Android 会在 ViewRootImpl 中调用 checkThread 办法检测是否是在 UI 线程中更新 UI // ViewRootImpl.javafinal Thread mThread;public ViewRootImpl(Context context, Display display) { mThread = Thread.currentThread();}void checkThread() { if (mThread != Thread.currentThread()) { throw new CalledFromWrongThreadException( "Only the original thread that created a view hierarchy can touch its views."); }}为什么 Android 只能在 UI 线程中更新 UI,不能在子线程中更新 UI1?Android 为什么不应用多线程更新 UI呢? GUI 框架为什么是单线程的2晚期的 GUI 应用程序都是单线程的,并且 GUI 事件在 ”主事件循环“ 中进行解决。以后的 GUI 框架则应用了一种略有不同的模型:在该模型中创立一个专门事件散发线程(Event Dispatch Thread,EDT)来解决 GUI 事件 单线程的 GUI 框架并不仅限于在 Java 中,在 Qt、NexiStep、MacOS Cocoa、X Windows 以及其余环境中的 GUI 框架都是单线程的。许多人已经尝试过编写多线程的 GUI 框架,但最终都因为动态条件和死锁导致的稳定性问题而又从新回到单线程的事件队列模型:采纳一个专门的线程从队列中抽取事件,并将它们转发到利用程序定义的事件处理器。 ...

May 18, 2022 · 3 min · jiezi

关于android:FAQ用户访问次数不变访问时长却突增2倍分析服务发生数据异常该如何解决

在产品经营的工作过程中,须要每日关注产品的外围指标变动状况,监控其整体经营情况。华为剖析服务提供查看吸引新用户卡片,该卡片展现了新增用户数、人均会话次数、人均拜访时长、人均页面拜访数。借助该页面经营可察看拉新成果,判断产品对新用户的吸引力。 问题形容某开发者在集成华为剖析服务后,发现AGC概览页面上的人均会话时长突增至原来的两倍,然而人均会话次数并没有扭转,具体见下图: 该渐变景象不合乎失常逻辑,须要深度定位渐变起因。 定位过程(1)排除云测数据同步过程异样问题首先须要排查HUAWEI Analytics云测各计算节点有无异样。通过排查各个云测节点未发现异常,从端测采集上来的用户数和事件数都没有在云测各节点产生扭转。 (2)客户侧在数据突增当天是否有重大变更状况通过确认,该开发者在问题产生前一天公布了新版本。但客户新版本公布并没有重大内容变更,人均会话时长突增至2倍以上仍然难以解释; (3)剖析变动较大的用户事件和用户属性通过剖析现网用户事件和用户属性,发现现网中有局部用户setAnalyticsEnabled开关原来为false的被置位true,即现网中原来有一批不参加剖析的用户在App降级后参加了剖析,开发者没有在App新版本中继承原来的开关状态。最终导致新增一批参加剖析的用户,且这部分用户会话时长较长,最终导致人均会话时长减少。 再近一步剖析这群新增用户,咱们发现次要为iOS用户。iOS过后还未提供切后盾敞开会话的机制,所以iOS用户在切后盾后并不会像Android一样30秒后敞开会话,而是直到零碎或者用户将App齐全敞开后才敞开会话,所以iOS零碎用户会话工夫更长,最终导致整体的均匀会话时长突增。 起因总结开发者App新版本上线后,现网中有局部用户原来setAnalyticsEnabled开关为false的被置为true,新增一批参加剖析的用户。即现网中有一批原来不参加剖析的用户在App降级后参加了剖析,开发者没有在App新版本中继承原来的开关状态。最终导致新增一批参加剖析的用户,且这部分用户绝大多数为iOS用户,iOS过后还未提供后盾运行敞开会话的接口,导致整体人均会话时长突增。 解决方案1.App新版本更新是继承前一个版本的setAnalyticsEnabled开关状态; 2.HUAWEI Analytics后续针对iOS版本的SDK提供session敞开接口,开发者届时可自定义session敞开策略,可解决会话时长突增的问题。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 18, 2022 · 1 min · jiezi

关于android:独立产品数据分析和优化

【教你赚钱】数据分析和优化多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 都有哪些数据,以及为什么要优化数据?咱们的产品上线之后,会有各种各样的数据,产品自身的有性能渗透率、产品日均关上次数、均匀单次应用时长、解体率、留存率等;商店相干的则有下载量、商店转化率、产品评分、评论数量等;产品推广则有:客单价、广告点击率,广告转化率、日均广告打算耗费等;产品营收方面则有付费率、订阅率、退款率、广告CPM、广告点击率、单用户广告均匀展现次数、ARPU等等。 咱们在产品经营过程中,下面提到的数据可能有些体现很好,有些则会显得有余,而咱们要做的就是依赖采集到的这些数据,剖析数据起因而后致力去优化一些数据指标,最终的目标是进步咱们产品的竞争力以及进步产品营收。 上面介绍几个常见的产品数据: 解体率解体率属于产品稳定性的一个数据,Android产品通常有Crash和ANR两种运行问题,解体率指的个别是Crash,即用户应用时的解体问题。解体率分为用户解体率和运行解体率,用户解体率是产生App解体行为的用户占沉闷用户的比例;运行解体率是产生解体的应用次数占所有冷启应用次数的比例。无论是哪一种,作为产品研发人员,咱们都要尽可能的升高,当然一个产品想要一点问题没有,只有两种可能:一是产品没人用,二是产品太过简略。所以将产品解体率升高在一个可承受的范畴,是咱们日常开发中须要坚持不懈保持的事件。 升高解体率一方面是晋升用户应用体验,更进一步也对咱们的产品营收有正向影响。 留存率留存(Retention),指的是用户在注册之后,在一段时间之内,做出某个特定行为的比率,通常咱们会关注次日留存和周留存这两个数据。次日留存简称次留,指的是用户在下载利用当天的下一个天然日,也进入利用进行了应用,此时这就是一个次留的用户。周留存则是用户在下载之后的下一个天然周,也进入援用进行了应用,这时,该用户就是一个周留存用户。其它诸如半月留存还有月留存之类的留存数据能够类推。 留存这个指标的意义在于,能够通过留存来掂量产品对用户的成果,留存越高,阐明用户对产品的性能较为称心,的确能够帮忙用户解决一些问题,反之留存很低,要么是产品自身性能就不是一个高频的场景,要么就是用户对产品不称心,进行了卸载。工具类产品通常留存会强依赖于应用场景,当用户在某个场合须要用到产品时,就会关上应用,用完即走,通常会有比拟好的长线留存装置保留,然而用户沉闷时长会较低。 留存指标的另一个意义是能够掂量用户价值,如果咱们采取的是利用内广告的变现形式,那么用户留存的工夫越长,则可能发明的广告支出就越高,用户生命周期价值(ARPU)就会越高。 综上就是留存是一个波及产品和变现的重要指标,在咱们的研发和迭代经营过程中都应该重点关注优化。 性能渗透率指的是用户对产品的体验深度,渗透率越高,阐明用户对产品趣味越大,相应的产品应用工夫就越长,用户的留存就可能会更高,对应的用户生命周期价值就会越高。反之如果用户进入产品就来到,阐明产品就是毫无吸引力,对应的收益就会较差,付费的产品就会面临用户退款。 下载量这个很好了解,就是累计的在商店下载的用户总数,通常笔者只看新用户,不怎么关注回流用户和新设施。下载量是咱们进步商店转化率的一个重要指标,因为雷同性能的产品,下载量高的通常会关键词排名靠前,用户也更偏向于抉择下载量五百万的而不是下载量五百的利用。 对于下载量的展现,Google Play有本人的一套规定,顺次展现0,0+,10+,50+,100+,500+,1k+,5k+,10k+,50k+,100k+等以此类推,在区间内向下取整。通常一个新产品,咱们会重点关注几个节点的达成:500+是一个门槛,如果咱们的利用达不到这个门槛,那么就能够发表为一个失败的产品,因为这意味着利用对用户毫无吸引力。10k+的利用则阐明产品有了肯定的用户根底,在商店里有稳固的曝光,能够有较稳固的天然量用户,这个时候咱们的各种变现操作才会有意义。50k+则阐明咱们的产品取得了初步的胜利,曾经是一款值得长期保护的产品,此时产品的收益应该是稳定增长的,咱们要持续做的就是扩充战果,让收益最大化。 商店转化率商店转化率指的是进入查看了利用详情页的用户数外面最终下载利用的用户数所占比例。详情页转化率越高,阐明用户对咱们的产品趣味越高、商店的详情素材成果越好。反之咱们就须要想方法进步转化率,能够最大限度的获取更多的用户下载。 优化商店转化率通常有以下几种形式,通过更高效的产品阐明和截图,向用户更全面的展现咱们产品的长处,让用户感觉这个就是他想下载的App。还有就是进步产品的下载量,进步产品的评分,因为更高的下载量以及更高的评分,阐明有更多的用户称心咱们的产品,能够无效进步用户下载的志愿。 利用评分评估评分和评估是用户进行产品反馈的次要路径。一个App的评分越高好评越多,在相应关键字的利用排名中就会更加靠前,用户也会更违心下载这样的产品。 作为开发者,咱们须要继续关注咱们产品的评分和评估,一方面收集用户反馈优化产品,另一方面争取进步评分评估,既可能进步产品曝光率,还能进步商店详情转化率,对咱们的产品有较大的益处。 付费率用户付费率,特指在内购或者订阅的变现形式下,内购或者订阅的用户,占整体用户数的比例。通常作为开发者,咱们会谋求更高的付费率,这意味着咱们的产品失去了用户认可,以及更多的营收。 单客价值ARPU(ARPU-AverageRevenuePerUser)即每用户平均收入。在产品的用户生命周期内,该用户给咱们带来的总的支出,包含用户付费,订阅支出还有广告支出。这个指标能够掂量咱们产品的盈利能力,更高的单客价值,阐明咱们可承受更高的获客老本,以前据说tb和pdd的获客老本动辄一两百,那是因为他们单个无效用户的ARPU会远远高于这个老本。 点击率点击率是广告成果的掂量指标,既能够用来掂量咱们利用内广告的变现成果,也能够用来掂量咱们广告推广的素材成果。广告的点击次数占所有广告展现次数的比例,就是广告点击率。点击率越高,作为流量方咱们的CMP就会较高(并非相对线性相关,但有影响),作为广告主,咱们的广告素材成果就越好,意味着咱们的推广成果就会更好。 作为流量方,咱们须要关注点击率,然而切不可因而去做一些人工干预进步广告点击率的行为,目前大的广告平台都有其较成熟的检测机制来预防广告欺诈,一旦被发现,就是十分重大的解决,轻则勾销广告展现支出,重则封停广告账户。 广告转化率广告转化率指的是最终通过广告下载了App的用户数占展现过广告的用户比例。这个很好了解,转化率不只依赖于广告内容,也依赖于产品详情页的推广成果。 作为广告主,咱们的广告最终掂量的规范是激活的用户数量,这既关系到咱们的投放老本,也关系到咱们产品的推广成果。因而咱们须要在广告投放推广的过程中,继续关注广告打算的转化率,一直优化咱们的打算,最终达到一个不错的投放转化成果。 欢送关注不迷路,更多独立开发干货公众号(A曙光独立开发站)首发

May 17, 2022 · 1 min · jiezi

关于android:一起看-IO-Jetpack-Compose-中的新特性

Jetpack Compose 1.0 正式版曾经公布快一年的工夫了,咱们看到社区正以极大的激情驳回和应用 Compose: Kotlin 语法的简洁性以及使开发界面变得更疾速、更简略的申明式开发方式失去了宽广开发者们的赞叹。 Compose 在社区中的反应咱们看到 许多公司曾经在大规模驳回 Compose 为其利用开发最新、最具创造性的性能。例如,与咱们密切合作的 Play 商店团队很早便开始应用 Compose,通过他们咱们理解到,应用 Compose 不仅更乏味,且对他们团队生产力的进步也大有助益。Play 商店团队还通知咱们 "Play 商店的所有新性能都建设在该框架之上,Compose 有助于为利用解锁更快的速度以及更顺畅地公布"。与此同时,Twitter 也曾经在利用的不同局部应用了 Jetpack Compose 并从中受害,因为 "Compose 让咱们更容易定义本人的组件,并使它们的 API 更明确、灵便和直观。"Airbnb 团队同样也采纳了 Compose: "Jetpack Compose 是咱们技术策略的重要组成部分,生产力因而取得了大幅提高。" 咱们很快乐地看到这些团队在大规模和简单的生产环境中认真地评估并应用了 Compose,所带来的后果也不仅是让界面开发更清晰乏味,也带来了更多工程上的收益。这只是其中几个案例,因为 Play 商店排名前 1,000 的利用中有超过 100 个正在应用 Compose。 咱们在开发过程中始终保持着与这些团队的密切合作,并一直听取宽广 Android 社区的反馈,这也是咱们推动 路线图 的要害。现在,咱们专一于提供新的 API 和个性改良以反对您实现更高级的需要,这些改良将和新的工具一起助力您更轻松地应用 Compose 构建利用。Compose 从根本上扭转了界面的构建形式,为了帮忙您实现必要的思维转变,咱们将公布更多对于高级主题的指南、演讲和 Codelab,以及更具深度的视频,以便您编写外观和性能同样杰出的利用。以下是 Compose 1.2 Beta 版本的新个性: Compose 1.2 Beta咱们在往年的 Google I/O 大会上公布了 Compose 1.2 的第一个 Beta 版本,其中蕴含了许多个性和改良: ...

May 17, 2022 · 2 min · jiezi

关于android:HMS-Core-3D-Engine助您实现逼真3D渲染效果构筑大型3D数字世界

HMS Core 3D Engine是一款高性能、高画质、高牢靠的实时3D引擎,旨在帮忙开发者制作高品质的3D利用。3D Engine将为您提供可编程渲染管线,多维粒子系统,3D角色与动画,超大地形地貌,智能寻路导航等诸多实用功能,以及便捷高效的可视化开发工具。 3D Engine渲染成果 千万级面片数模型高效解决,高清画质即刻出现多线程PRB渲染管线,反对按需自定义渲染管线资源及渲染管线实例,实时实现多光源大场景高清画面渲染。3D Engine采纳业界支流Forward+渲染技术,反对遮挡剔除、实时全局光照、动静多光源,并提供景深、Bloom等弱小后处理性能,光影成果实在再现。 多维粒子系统实时渲染,海量粒子特效栩栩如生弱小的粒子系统反对CPU/GPU渲染灵便适配,批量管制粒子静止,单粒子随即扰动,高效模仿爆炸、火焰、雨雪等视觉特效。 3D角色与动画,人物动画晦涩天然3D Engine为开发者提供100+骨骼点实时骨骼动画,惟妙惟肖的表情动画,精准的全身反向动力学零碎,以及多重动画状态机交融性能,让开发者聚焦动画创作,制作精良晦涩的3D动画内容。 大尺寸简单地貌,精细化地形雕刻8K*8K超大地形编辑,32+图层实现简单材质混合,丰盛画笔工具灵便雕刻地形细节,真切出现山谷、河流、森林、沼泽等地貌特色。 AI导航寻路,NPC智能避障在游戏制作方面,3D Engine可能精准形容简单场景的可挪动外表,疾速生成导航网格,反对导航网格链接配置,实时刷新障碍物区域,反对多指标门路布局,精准管制NPC晦涩挪动。 可视化开发高效便捷,免代码构建简洁易用除了弱小易用的个性,HMS Core还为宽广开发者提供易上手的开发工具,反对场景编辑、材质编辑、动画编辑、地形编辑、脚本编辑等外围性能,帮忙开发者疾速集成、搭建3D场景、制作渲染特效。 更多场景,邀您实际置信HDC 2021上手语数字人灵动的手语表白给不少观众留下深刻印象,这是3D Engine弱小的渲染能力的实际之一。而在数字园区,虚构偶像演唱会,在线车展互动看车等诸多场景中,也不乏3D Engine的深度利用。3D Engine继续与搭档单干,期待与更多开发者独特打造翻新场景,构筑数字孪生世界。开发者能够登录3D Engine主页,理解更具体的产品介绍与接入筹备,也能够登录华为开发者联盟官网,查看更多HMS Core翻新凋谢能力。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 17, 2022 · 1 min · jiezi

关于android:手把手带你自定义-Gradle-插件-Gradle-系列2

请点赞加关注,你的反对对我十分重要,满足下我的虚荣心。 Hi,我是小彭。本文已收录到 GitHub · Android-NoteBook 中。这里有 Android 进阶成长常识体系,有气味相投的敌人,欢送跟着我一起成长。(联系方式在 GitHub) 前言Gradle 实质上是高度模块化的构建逻辑,便于重用并与别人分享。例如,咱们相熟的 Android 构建流程就是由 Android Gradle Plugin 引入的构建逻辑。在这篇文章里,我将带你探讨 Gradle 插件的应用办法、开发步骤和技巧总结。 这篇文章是全面把握 Gradle 构建零碎系列的第 2 篇: 1、Gradle 根底2、Gradle 插件3、Gradle 依赖治理4、APG Transform1. 意识 Gradle 插件1.1 什么是 Gradle 插件Gradle 和 Gradle 插件是两个齐全不同的概念,Gradle 提供的是一套外围的构建机制,而 Gradle 插件则是运行在这套机制上的一些具体构建逻辑,实质上和 .gradle 文件是雷同。例如,咱们相熟的编译 Java 代码的能力,都是由插件提供的。 1.2 Gradle 插件的长处尽管 Gradle 插件与 .gradle 文件实质上没有区别,.gradle 文件也能实现 Gradle 插件相似的性能。然而,Gradle 插件应用了独立模块封装构建逻辑,无论是从开发开始应用来看,Gradle 插件的整体体验都更敌对。 逻辑复用: 将雷同的逻辑提供给多个类似我的项目复用,缩小反复保护相似逻辑开销。当然 .gradle 文件也能做到逻辑复用,但 Gradle 插件的封装性更好;组件公布: 能够将插件公布到 Maven 仓库进行治理,其余我的项目能够应用插件 ID 依赖。当然 .gradle 文件也能够放到一个近程门路被其余我的项目援用;构建配置: Gradle 插件能够申明插件扩大来裸露可配置的属性,提供定制化能力。当然 .gradle 文件也能够做到,但实现会麻烦些。1.3 插件的两种实现模式Gradle 插件的外围类是 Plugin<T>,个别应用 Project 作为泛型实参。当应用方引入插件后,其实就是调用了 Plugin#apply() 办法,咱们能够把 apply() 办法了解为插件的执行入口。例如: ...

May 17, 2022 · 7 min · jiezi

关于android:HMS-Core使能AI智慧体验共建创新应用生态

5月17日,2022年搜狐科技峰会胜利举办,峰会汇聚各界大咖,独特探讨AI 技术的深刻利用以及行业数字化的发展趋势。华为终端云服务利用生态BU总裁望岳发表题为《使能AI智慧体验,共建翻新利用生态》主题演讲。 望岳示意,通过多年的倒退迭代,华为挪动服务HMS生态已成为寰球第三大挪动利用生态:截止明天,华为寰球注册开发者达540万,寰球集成HMS Core的利用超过20.3万个。这证实HMS生态失去了寰球开发者的认可和青睐,越来越多的开发者抉择退出HMS生态,为寰球用户提供优质利用,带来翻新体验。 作为华为端、云凋谢能力的合集,HMS Core继续构建多终端、跨OS、全场景的翻新凋谢能力,面向开发者提供行业解决方案。截止2022年3月31日,HMS Core 6共凋谢了7大畛域的70个Kit和超过2万个API,通过一直凋谢丰盛的能力和服务,打造全场景万物智联的利用生态底座,让开发更简略,让翻新更高效,让将来有迹可循。 修筑AI利用“快车道”,为用户打造全新AI体验在AI高速倒退的当下,如何简略快捷地使用AI能力,让更多翻新体验落地在手机利用中?本次搜狐科技峰会上,望岳重点围绕HMS Core在AI翻新凋谢能力做了具体的分享与探讨。 在HMS Core AI畛域中,HMS Core打造的机器学习服务(ML Kit)提供丰盛的文本类、语音语言类、图像类和人脸人体类服务API。绝对于其余解决方案,ML Kit可能提供本地算法从而无需上传云端解决,晋升了对用户平安的爱护;而且ML Kit本地算法在精度和模型体积的平衡性商行达到了较好的成果,并且算法性能优异,开发者可依据理论利用需要训练,生成自定义化的AI模型。 不止在AI畛域,HMS Core也将AI能力使用在其余畛域中,如媒体畛域视频编辑服务中,通过AI技术实现的指标遮挡、指标追踪以及滤镜拟合个性,音频编辑服务的音频渲染个性等,助力用户高效创作;而图形畛域的3D建模服务、AR Engine实时环境光照跟踪等,则帮忙利用打造挪动端的沉迷数字体验,使能沉迷式数字孪生世界构建 此外,在华为当先的通信畛域,开发者能够通过Network Kit的 AI动静调参、AI智能分片技术,实现千人千面的网络参数调优,让用户尽享疾速下载体验。同时通过无线传输服务(Wireless Kit)的AI信号预测能力,可针对手机信号笼罩较弱的区域,提前对区域信号进行判断与优化,带来间断、不间断的网络体验。 华为在很早之前就开始了无障碍沟通方面的摸索,通过一直的积攒,最终将这方面的技术通过HMS Core手语服务(SignPal Kit)凋谢给开发者。目前,SignPal Kit曾经笼罩日常生活词汇和许多高频词汇,手语准确率超过90%(数据源于华为实验室),可帮忙遍及国家通用手语规范,帮忙听障人群学习、浏览、实现手语教学等,让更多的开发者一起为无障碍沟通环境建设添砖加瓦,让智能惠及每个人。 全方位联接开发者,继续激励、生态共赢将来的数字世界是一个生态的世界,全场景智慧时代更须要继续的翻新。华为正通过华为开发者日(HDD)、HMS寰球利用翻新大赛等形式多样的交流活动全方位连贯开发者、合作伙伴,共建共享共赢HMS新生态,独特推动数字化翻新走向寰球。 华为开发者联盟凋谢的全球化平台、全场景能力、利用全生命周期服务,成为开发者成长的“助推器”。华为利用市场作为寰球三大利用市场之一,成为开发者与消费者的“连接器”,继续助力开发者高效散发。面向海内,华为AppTouch整合寰球运营商资源,帮忙开发者疾速切入寰球市场,成为开发者出海创收的“加速器”。 2022年HMS寰球利用翻新大赛也行将在6月开赛,期待更多开发者携翻新优质的利用参赛,为HMS生态的建设添砖加瓦,协力共赢将来。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 17, 2022 · 1 min · jiezi

关于android:移动应用开发迎来哪些新技术5月24日相约HDD线上沙龙创新开发专场

HUAWEI Developer Day(简称HDD),是华为开发者联盟与宽广开发者深度交换的平台。围绕挪动终端的最新技术和产品状态,继续向宽广开发者传递华为终端的最新产品和凋谢服务能力,联合最新的行业发展趋势,携手开发者独特打造面向终端消费者的卓越用户体验。 5月24日18:50-21:05,HDD·线上沙龙·翻新开发专场将采纳全新的3D虚构背景,同步在华为开发者学堂、开发者联盟视频号、开发者联盟B站、开发者联盟微博、终端云服务微博、华为视频、51CTO、CSDN等线上平台与宽广开发者见面。 什么是HarmonyOS服务卡片?服务卡片能够为用户带来怎么的利用翻新体验?如何应用IDE工具DevEco Studio来高效开发一款服务卡片? 如何利用HMS Core提供的ML Kit和HiAI Foundation凋谢能力便捷高效开发AI利用,给消费者带来更多酷炫好玩的智能体验? 华为Serverless构建类服务,如何帮忙开发者实现降本增效,解决运维老本高、网站部署周期长等开发问题? 华为开发者联盟与Cocos游戏引擎深刻单干又将带来哪些实战成绩? 以上问题,此次HDD翻新开发专场,专家们将为您一一解答。全程参加,您将播种: 通过实际案例,理解如何打造一款受用户欢送的HarmonyOS服务卡片 把握HMS Core机器学习服务,帮忙开发者解决文本翻译、同声传译等开发难题 理解端侧AI部署的价值,HMS Core HiAI Foundation架构、劣势和开发指南 应用Serverless多种服务帮忙开发者对立构建主动弹性伸缩能力,实现降本增效 国产游戏引擎Cocos Creator帮忙游戏开发者专一游戏内容创作 本次沙龙还将特地增设讲师线上答疑及互动抽奖环节,更有HUAWEI nova 8 SE手机大奖等惊喜礼品等您来拿!直播期间您能够在华为开发者学堂登录、注册后参加互动抽奖。 HDD·线上沙龙·翻新开发专场报名渠道现已开启。欢送登陆【华为开发者联盟官网】,进入流动专区【HDD·线上沙龙·翻新开发专场】主页,点击“立刻报名“按钮,注册为华为开发者联盟会员后收费参加报名,报名后果和直播地址将在报名胜利后通过邮件和短信模式告诉。期待您的参加! 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 17, 2022 · 1 min · jiezi

关于android:Androidbp快速入门

一、Soong 编译系统在 Android 7.0 公布之前,Android 仅应用 GNU Make 形容和执行其构建规定。在Android零碎级编译中,Make 构建零碎失去了宽泛的反对和应用,但它有一些毛病:编译迟缓、容易出错、无奈扩大且难以测试,而Soong 构建零碎正好提供了 Android build 所需的灵活性。 Soong 构建零碎是在 Android 7.0 (Nougat) 中引入的,旨在取代 Make。它利用 Kati GNU Make 克隆工具和 Ninja 构建零碎组件来减速 Android 的构建,Soong的编译流程图如下。 Soong编译系统下,本来打算输出是.bp文件,输入是.ninja文件,然而因为零碎中的.mk文件还没有被齐全打消掉,因而提供kati和ckati工具将.mk/Makefile文件转换为.ninja文件。.ninja成为编译系统的汇编文件,是不须要人为去批改的,相当于配置文件来调用gcc、java、clang等编译器去编译。 Soong编译系统的设计思维是打消.mk文件中的if/else等逻辑,使.bp文件只是一个简略的编译逻辑,这些简单的抉择配置逻辑应该放在更高层,比方应用更好调试的Python来编写。 二、Android.bpAndroid.bp的呈现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯正的配置,没有分支、循环等流程管制,不能做算数逻辑运算。如果须要管制逻辑,那么能够应用Android.mk或者Go语言进行编写。 2.1 示例Android.bp 文件中的模块以模块类型结尾,而后是一组格局属性:name: value,在一点上Android.bp的语法结构与JSON的语法结构类似,都是以键值对的模式编写,比方。 android_app { name: "Provision", srcs: ["**/*.java"], platform_apis: true, product_specific: true, certificate: "platform",} 每个模块都必须具备 name 属性,并且相应值在所有 name 文件中必须是惟一的,仅有两个例外情况是命名空间和预构建模块中的 Android.bp 属性值,这两个值可能会反复。 srcs 属性以字符串列表的模式指定用于构建模块的源文件。能够应用模块援用语法 ":<module-name>" 来援用生成源文件的其余模块的输入,如 genrule 或 filegroup。 android_app{}下面代码的意思是,该模块用于构建一个apk。如果要给模块指定一个名字,能够应用上面的形式。 name: "Provision",如果指定了 android_app 模块类型(在代码块的结尾),就须要设定该模块的name 。此设置会为模块命名,生成的 APK 将与模块名称雷同,不过带有 .apk 后缀。例如,在本例中,生成的 APK 将命名为 Provision.apk ...

May 16, 2022 · 2 min · jiezi

关于android:为什么说-Gradle-是-Android-进阶绕不去的坎-Gradle-系列1

前言Gradle 作为官网主推的构建零碎,目前曾经深度利用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等。可见,要成为 Android 高级工程师 Gradle 是必须把握的知识点。在这篇文章里,我将带你由浅入深建设 Gradle 的基本概念,波及 Gradle 生命周期、Project、Task 等知识点,这些内容也是 Gradle 在面试八股文中容易遇见的问题。 从这篇文章开始,我将带你全面把握 Gradle 构建零碎,系列文章: 1、Gradle 根底2、Gradle 插件3、Gradle 依赖治理4、APG Transform请点赞,你的点赞对我意义重大,满足下我的虚荣心。 Hi,我是小彭。本文已收录到 GitHub · Android-NoteBook 中。这里有 Android 进阶成长常识体系,有气味相投的敌人,欢送跟着我一起成长。(联系方式在 GitHub) 1. 意识 GradleGradle 并不仅仅是一个语言,而是一套构建工具。在晚期,软件构建只有编译和打包等简略需要,但软件开发的倒退,当初的构建变得更加简单。而构建工具就是在这一背景下衍生进去的工具链,它可能帮忙开发者可反复、自动化地生成指标产物。例如 Ant、Maven 和 ivy 也是历史演化过程中诞生的构建工具。 1.1 Gradle 的优缺点相比于晚期呈现的构建工具,Gradle 可能怀才不遇次要是以下长处: 表白性的 DSL: Gradle 构建脚本采纳基于 Groovy 的 DSL 畛域特定语言,而不是采纳传统的 XML 文件,相比 Maven 等构建零碎更加简洁;基于 Java 虚拟机: Groovy 语言基于 Java 虚拟机,这使得 Gradle 反对用 Java / Kotlin 代码编写构建脚本,咱们齐全能够只学习一小部分 Groovy 语法就能上手 Gradle 脚本,升高了 Gradle 的学习强度;约定优先于配置: Gradle 具备约定优先于配置的准则,即为属性提供默认值,相比 Ant 等构建零碎更容易上手。咱们在开发 Gradle 插件时也须要遵循这一准则。Gradle 也有显著的毛病,例如: ...

May 16, 2022 · 11 min · jiezi

关于android:FAQ申请华为运动健康服务授权的4个常见问题及解决方法

华为静止衰弱服务(HUAWEI Health Kit)提供原子化数据凋谢,在获取用户对数据的受权后,利用可通过接口拜访静止衰弱数据,对用户数据进行增、删、改、查等操作,为用户提供静止衰弱类数据服务。这篇文章中咱们总结了开发者提出的受权相干的典型问题并给出了参考解决办法,心愿为其余遇到相似问题的开发者提供参考。 1. Android App不能唤起Health Kit受权,HealthKitAuthResult result 受权失败statusCode: 6003的起因是什么?“6003”是HMS Core SDK框架的报错。当证书指纹校验-签名证书指纹谬误时,将返回6003错误码。此时,须要依照以下2个步骤查看apk中配置的签名证书是否正确。 步骤1.查看申请相干服务时是否配置了正确的证书指纹。关上利用的APK,将其中“META-INF”文件夹解压进去,失去其中的“CERT.RSA”文件,通过keytool -printcert -file META-INF/CERT.RSA命令打印签名证书信息。 步骤2.登录AppGallery Connect,单击“我的我的项目”,抉择须要操作我的项目,进入我的项目页面后抉择利用,而后在“我的项目设置 > 惯例”中查看“SHA256证书指纹”配置的信息是否与步骤1的指纹统一。 更多HMS Core SDK框架错误码可参考官网文档 2. 调用接口时返回50005错误码“鉴权未知谬误”,是什么起因?调用端侧接口返回50005错误码,请做如下查看: (1)受权操作前,请确保你在联盟卡片中申请读/写的静止衰弱数据的审核曾经通过。 (2)利用在拉起受权页面时,展现给用户可抉择受权的数据须要蕴含在联盟卡片审核通过的静止衰弱数据中。 (3)利用可操作的用户数据为联盟卡片审核通过的数据类型读/写权限与用户在受权页面勾选的数据类型读/写权限的交加。 (4)HMS会对Scope权限信息进行缓存,缓存时长为24小时。如果呈现此谬误,可能是缓存起因导致。 在手机“利用治理”里革除“HMS Core”的缓存和数据。 在“华为帐号 > 隐衷核心 > 管制对您帐号的拜访”里勾销对App的受权,而后从新关上App登录华为帐号并申请受权。 3. 获取token报20022(invalid direct_uri),个别是什么起因导致的?错误码20022示意redirect_uri的格局校验没有通过。倡议做如下的查看: (1)应用redirect_uri获取token时,填写的redirect_uri须要与您在申请帐号服务-设置帐号服务信息时,填写在利用的“产品服务>帐号>回调地址”中的填写的统一。 (2)redirect_uri须要通过URLEncode编码。 留神:用户在受权页面批准受权后,OAuth受权服务将响应值受权码Code,通过回调地址redirect_uri返回给利用,此时返回的是URLEncode编码后的受权码,可间接应用。应用Postman 申请时,Body用x-www-form-urlencoded时,code须要先解码再应用,即URLDecode编码;body用raw格局时,code可间接用,不须要解码。 认证鉴权示例参考文档 更多华为帐号REST错误码信息参考文档 4. 我的利用须要获取用户最近一次跑步时的静止工夫、热量耗费、配速、均匀心率以及步数数据,在Health Kit申请时是否须要申请静止衰弱数据中的心率数据权限?还是只需申请静止记录数据权限?在代码局部的Scopes又该申请哪些权限?如果你的利用须要读取静止衰弱App上静止记录卡片中的数据,首先须要理解静止记录数据凋谢由两局部权限组成: (1)静止记录概要数据权限联盟卡片申请的权限名称:静止记录数据 > 用户静止记录数据 读取静止记录的Scope权限: Android SDK接入:Scopes.HEALTHKIT_ACTIVITY_RECORD_READ REST接入:https://www.huawei.com/health...(Scope权限URL) 以跑步静止记录为例,当你的利用须要获取用户跑步静止记录中的间隔统计、卡路里统计、步数统计等采样统计数据类型时,因为采样统计数据类型属于静止记录概要数据中的一部分,只须要申请用户静止记录数据读权限。 (2)静止记录关联的原子采样数据权限须要每个原子采样数据类型对应的OAuth权限。 以跑步静止记录为例,如果你的利用须要获取跑步静止记录关联的GPS详情、步频详情、海拔的详情等数据,那么还须要每个原子采样数据类型对应的OAuth权限。 原子采样数据类型对应联盟卡片申请的权限名称、Scope权限请参见联盟文档的数据类型章节:Android SDK接入 REST接入 理解更多详情>> 拜访华为静止衰弱服务联盟官网 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee ...

May 16, 2022 · 1 min · jiezi

关于android:一起看-IO-Google-Play-更新一览

作者 / Alex Musil, Product Management at Google Play 在往年的 Google I/O 大会上,咱们重点介绍了帮忙大家在 Google Play 上继续倒退业务的三条次要路径: 为用户和开发者放弃生态系统安全的隐衷和安全措施,如新的 Google Play SDK 索引;帮忙您在整个利用生命周期内进步利用品质的工具;通过 LiveOps 等性能获取新用户以及与现有用户互动的新形式,以及提供 新的订阅性能 推动支出增长。请观看 I/O 大会演讲视频 一览全副更新,也能够持续浏览本文以疾速理解这些能助您的业务更进一步的新性能。 爱护开发者和用户的隐衷和安全措施在过来几年里,咱们始终在致力开发多种工具,让 SDK 对每个人都更好用、更平安,包含 SDK 供应商、利用开发者,以及咱们的终端用户。 2020 年,咱们推出了 Google Play SDK 管理中心,它提供了应用统计数据、解体报告,还能够让 SDK 供应商通过 Play 管理中心和 Android Studio 与利用开发者进行沟通。当初,咱们推出了 Google Play SDK 索引,这是一个新的公开站点,其中列出了利用范畴最广的商用 SDK,还提供了对于每个 SDK 的数据和洞察。这套索引收录了 100 多个 SDK 及其具体信息,包含这些 SDK 应用了哪些利用权限、应用到这些 SDK 的利用的统计数据,以及 SDK 供应商是否承诺其 SDK 代码遵循 Google Play 政策。您能够通过这套索引来决定在利用中该应用哪些 SDK 以及它们的具体版本。 ...

May 16, 2022 · 2 min · jiezi

关于android:独立开发者盈利的几种姿势

【教你赚钱】本人做的产品如何赚钱?多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 端正态度,面向盈利接入了利用内广告,咱们的产品性能渗透率不高,用户次留差,用户评估低,怎么办? 首先咱们要端正态度:咱们做利用不是来做慈悲的,咱们提供了服务,为的是获取报酬,所以,接广告嘛,挣钱嘛,不寒碜。其次是咱们须要通过各种试验比照,来剖析,到底是性能自身造成的次留差、评估低,还是广告的接入带来的这些负面影响。 如果是性能问题,咱们就优化性能;如果是广告问题,咱们一方面能够优化广告策略,一方面能够给用户提供付费去广告的抉择。 核心思想就是,在盈利和用户称心之间,谋求一个平衡点,争取双赢。 双赢能够短暂,单赢必然不行这里探讨的单方,指的是服务的提供者和消费者,也就是咱们和用户。 咱们开发产品提供服务,首先是会有各种老本,而后就是咱们也是为了赚取利润。很少有人会违心自掏腰包始终服务他人,如果你是,那么请出门左转,没有接着看的必要了 。所以作为服务的提供者,咱们的赢就是获取利润,而消费者的赢是舒心地享受服务。双赢就是咱们失去了利润,用户享受了服务。单赢就是咱们赔本赚吆喝、用户享受服务,或者是咱们割用户韭菜赚的盆板钵满,用户被坑骗,无论是哪一种单赢,都是不短暂的交易。 产品赚钱的几种姿态付费下载顾名思义,这种模式下用户必须付费能力下载安装利用,这种形式益处是能保障单个用户的价值较高,害处是会大大提高用户的下载门槛,十分考验利用对用户的吸引力,毕竟用户须要实实在在地付出真金白银。笔者目前的营收主力产品就是付费下载,一次付费一生应用,利弊皆有吧。 付费下载的要求就是对用户有不可或缺的吸引力,用户违心为此买单。目前市面上大部分的3A游戏大作或者某些行业的业余工具,都是采取付费下载盈利模式。用户得先花钱,能力开始享受服务,当然服务不称心的话,一段时间内是能够无理由退款的。笔者的付费产品目前大略10%左右的退款率,处在可承受范畴。 因而付费下载的利用,首要的就是进步产品的独特性,并且在商店详情页更残缺地展现出产品的长处,进步用户的付费下载转化。其次是要真切的满足用户需要,这样能力缩小用户付款后的退款行为,虚伪宣传基本上能够定性为他杀行为。 付费下载另一个须要留神的点是盗版问题。笔者的产品也深受盗版影响,只有你做了收费流动,流动完结过两天后盾数据就会统计到很多盗版用户。笔者之前有一天看数据,发现利用激活量猛增,认为是发家致富了,后果发现是一家塞尔维亚的网站盗版了咱们的产品,造成盗版用户激活量猛增,对咱们开发者来说,这是一种深深的挫伤行为。 对于盗版问题在这里多说两句,盗版问题不仅仅是付费利用会有,收费利用做的好一样会有盗版,笔者之前的一款收费利用,接入了利用内广告,因为一直地被盗版,导致广告账户始终被有效流量问题纠缠,后果就是一款收费利用,既没有用户付费,也没有广告填充,广告账户还被各种审查,顺带影响了我另一款失常产品的广告支出,苦不堪言。 利用内购利用内购就是用户能够收费地下载利用,然而须要为某些特定的性能付钱,如果咱们的利用采取这种盈利模式,就须要思考哪些性能会是用户违心花钱的中央,比方咱们的产品是聊天工具,那么付费表情包或者是个不错的选项。 目前国内大多数手游都是内购的盈利形式,用收费的游戏吸引用户,造成规模效应,而后利用内提供道具皮肤来免费,赚取利润。更加暴力一点的就是充钱让你变得更强,不过这种影响平衡性的操作大部分都是飞蛾扑火。 利用内购实用于那些性能能够明确分档的产品,通用的根底性能,咱们收费提供,而进阶的性能,咱们通过内购来解锁,这样做的益处是咱们能够用不便疾速地获取大量的根底用户,这些都是咱们利用内广告或者内购的待转化用户。后续咱们无论是采取哪种变现形式,都能够熟能生巧,毕竟流量自身就是价值。 所以内购的思路个别就是付费去广告,或者付费解锁性能或者内容。至于具体是那些内容,就须要依据产品来具体分析了。笔者尝试过付费去广告还有付费后果产品性能的应用次数限度,可能是产品自身性能并没有稀缺性,所以付费率非常低且退款率极高,等于没有这个性能。 利用内广告置信大家都在本人用过的利用内看过广告,这是目前大多数App的盈利形式,并不间接从用户手里赚钱,反而是通过接入如Google Admob或者国内的广点通穿山甲之类的广告平台,来从广告商那里赚取广告费,常见的利用内广告格局有Banner、插屏、开屏、原生以及激励视频等。能够说是否理解广告接入很大水平上决定了咱们的利用是否是白忙一场,毕竟能让用户违心花钱的利用自身还是比拟难做进去的。 对于利用内广告的内容,能够说是十分地多,比方广告平台的抉择,利用内广告位的设计,广告成果的量化,广告支出的优化以及具体的一些注意事项和问题,这些笔者会在后续花几篇文章的篇幅来详述。 欢送关注不迷路,更多独立开发干货公众号(A曙光独立开发站)首发

May 16, 2022 · 1 min · jiezi

关于android:独立开发者产品思维的培养

【教你赚钱】产品思维的造就多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 什么是产品思维置信很多人都会听到或者碰到这个问题(尤其咱们思考成为独立开发者)。那么产品思维到底是什么呢?咱们能够先把“产品思维”这个词拆开看。 产品是什么?产品是满足用户需要、解决用户问题的性能的汇合(产品自身并没有价值,有价值的是其背地提供的服务)。 思维是什么?思维是思考问题的形式,不同的人因为经验和教训不同,思考问题的形式也不同。 论断就是:产品思维其实就是,一种解决问题的综合性的思维,进一步把问题解决方案产品化的过程。 具体分析产品思维解决问题,又可能分为:发现问题、剖析问题、解决问题,能够把他看成一个标准化的过程。 (1)发现问题发现问题的渠道,通常是从用户中发现,从生存/工作中发现,及从数据中发现。 从用户中发现:是一种比拟重要的思维形式,任何产品的出发点,都是为用户解决问题。你须要把本人看成用户,在遇到同样的状况,你会做什么抉择,有什么样的感触。从生存/工作中发现:随着日常生活的丰盛,咱们在生存/工作中,也会遇到各种各样的问题。咱们遇到的问题,也会有人遇到雷同的问题。那么这些问题就会成为共性,有待解决。从数据中发现:数据的减少、缩小,都是对业务状况最为精准的反馈。最简略的,如果某个性能应用的用户数比拟多,那么能够看做该性能是比拟胜利的。(2)剖析问题 - 5w法对一个问题点间断以5个“为什么”来自问(不肯定是5个“为什么”,也能够是3个、10个),以追究其根本原因。也就是咱们常说的打破砂锅问到底。5why法的关键所在:激励解决问题的人要致力避开主观或自负的假如和逻辑陷阱,从后果着手,沿着因果关系链条,顺藤摸瓜,直至找出原有问题的根本原因。能够三个层面来施行: 为什么会产生?从“生产”的角度。为什么没有发现?从“校验”的角度。为什么没有从零碎上预防事变?从“体系”或“流程”的角度。(3)解决问题 - 效率思维互联网产品的实质,就是相比传统行业,有更高效的解决方案。商业的倒退方向,肯定是向着更高效率的方向倒退。通过晋升业务参加某个或多个主体的效率,能大幅晋升交易。要高效解决用户问题,就肯定要提供最简略、最易了解的操作,把简单的业务操作留给本人。把少留给用户,把多留给本人;把简略留给用户,把简单留给本人。为了用户的少、用户的效率,咱们要做更多。 (4)产品化 - 问题解决方案标准化通过演绎提炼,总结共性,把发现问题、剖析问题、解决问题造成一个标准化的流程。这样做的益处在于,不管思考任何问题都能够遵循这样的流程。 最终论断所以,产品思维可进一步表述为:产品思维是一种解决问题,并将解决问题的计划产品化的综合思维。 它通过用户思维、数据思维去发现问题。通过实质思维去剖析问题,通过效率思维去解决问题,通过标准化办法将解决问题的计划产品化。 点点关注不迷路,更多搞钱干货公众号(曙光独立开发站)首发

May 15, 2022 · 1 min · jiezi

关于android:FAQ分析服务导出的事件数据和概览页面展示的数据不一致该如何解决

华为剖析服务面向开发者提供两种数据展示形式:(1)事件数据下载,开发者能够将事件数据下载后导入到自有的剖析零碎中;(2)间接在AGC概览页面查看用户数和事件数。 问题形容某开发者想将事件数据导入到自有零碎中,他在导出数据时将标识用户形式抉择“按UserID和设施”,最初发现导出数据中的事件数比剖析服务概览页面展现的数据少。 定位过程(1)导出数据的事件数与概览页面展现的数据量细节首先通过后盾查问,某客户某天的DAU数据为252xxx,导出的数据中按UserID去重后的DAU为192xxx,占比76.3%,有23.7%的差距。 (2)差量数据的特点针对数据导出的事件数与概览页面展现的数据中的差量数据进行深度剖析,找出这些差量数据具备的特点。咱们发现这些差量数据中18.5%的用户只上报自采集事件,然而没有上报预置事件/自定义事件;5.2%的用户无UserID,其为纯AAID用户。 根本原因数据导出不反对主动采集事件的导出,所以局部只有主动采集事件的用户不会在表格中呈现; AGC概览页面展现的数据是UID+DID的数据,而数据导出没有计算蕴含DID的数据,因而数据偏少。 解决方案如果开发者想依照UserID去统计并心愿获取更为全量的用户数据,倡议在App启动入口间接埋点自定义事件,确保在用户一进入利用就能触发自定义事件。否则用户进入App后无操作退出利用,这个过程只触发自采集事件,将不会在数据导出中出现。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 15, 2022 · 1 min · jiezi

关于android:Android开发者走向独立开发

【教你赚钱】Android开发者走向独立开发多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 或者这个题目不该局限于Android开发者,毕竟笔者的愿景是让更多有趣味的人都能通过集体利用来赚取本人的副业支出。 为什么要做副业赚取睡后支出?其实这个问题并不需要太多解释,因为尽管大家花钱的姿态各有不同,然而赚钱的起因却是相当地统一:因为须要没钱。这里的没钱,能够是因为行业支出不高,也能够是因为车贷房贷奶粉钱。大家的本职工作可能因为这样那样的起因,支出很难短时间晋升,比方行业不景气啊或者黑天鹅事件啥的造成了支出的下滑,当然也未必要目前经济有问题才去搞副业,毕竟多份支出多份保障,能额定给老婆买个包也是美滋滋的对吧。 因而,只有你有一些业余的工夫(如果你996或者007且甘之如饴,那就只能告辞了),并且有趣味有口头力副业赚钱,那么咱们就能够持续聊了。 副业做些什么接外包?说起程序员的副业,大家可能首先想到的就是接外包。外包仿佛是技术变现最简略的门路之一,咱们从雇主那里获取需要,开发实现后拿钱完结。然而事实上往往并不是这么简略,外包工作外面常见的问题有需要不明、沟通艰难、估算无限、验收崎岖、收款难如登天等等等等。 笔者大学时就和同学一起做过外包的我的项目,过后是替隔壁财经类学校一个守业的传授做一个财经培训学习的网站。开始时候咱们的需要非常简单:做一个高顿财经(不理解的敌人我简略说一句,这是一个十分大而庞杂的财经学习网站),通过咱们的致力沟通,最终确定做的内容其实并没有那么简单。我的项目艰巨的开发,咱们也尽责地在每个节点把开发的成绩给到甲方。后果就是在交付的时候,甲方爸爸找了一个莫名其妙的业内亲戚来验收,齐全颠覆了之前沟通好的功能设计,之后就是无尽的扯皮和批改,最终我的项目不了了之,当然咱们也未能收款。这个事件让笔者对外包工作疾恶如仇并示意再也不接。 当然外包也并非真的是洪水猛兽,笔者有个敌人,目前在南京一家事业单位工作,他从毕业就始终保持接我的项目做外包,外包业务波及各行各业,本人一个人前端后盾客户端甚至小程序都做。尽管他的我的项目不能让他有稳固的技术积攒,然而通过外包他还是取得了可观的支出,毕业几年靠本人在南京和老家各买了一套房。所以如果你是一个“真”全干工程师,而且能够稳固接到靠谱的外包工作,那么外包兴许也是一条致富之路。 投资?股票基金或者是当下或者始终以来最广泛的投资渠道,身边总是有一堆共事每天探讨着多少个点的收益或者最近是否又满脸绿光。笔者也已经试水过基金理财,奈何中丐互怜并不给力,轻轻松松就是十几个点的亏损,无奈只能割肉离场,在投资理财方面笔者是个不折不扣的菜鸟,因而也不违心深刻探讨。当投资变成赌博,动辄V字形高低十几个点的动荡,还是敬而远之,岁月静好。 自媒体?可能读者敌人会有个疑难:你始终在这教你赚钱教你赚钱,真能赚钱你本人不去赚在这教?答案是,教人赚钱也是赚钱,自媒体嘛,割韭菜嘛,不寒碜。很多人当初都在搞常识变现的自媒体,写文章写书出付费课程,笔者接触过很多技术类的博客,有的讲得好有的讲的烂,不一而足,就目前来说,自媒体也是笔者的一个尝试,一方面能够积淀一下本人理解的常识,一方面也心愿能帮忙到一些人,同时可能有些支出也是不错的,整体上心愿可能是多赢。 为什么是独立开发利用?这个其实关系到笔者本身的工作经验,笔者当年刚毕业,进入了一家几十个人的小公司做Android开发,几个人就是一个项目组,麻雀虽小然而五脏俱全,平时就是做一些工具类产品,组内围绕的工作核心就是广告变现。也因而笔者能够接触到一个产品,从立项到研发到最终经营变现的整个流程,平时的研发工作也是数据驱动,留存数据、沉闷、CPI、ROI、CPM这些各个方面的数据都会关怀并剖析,说是全干工程师也不为过。 基于以上的工作经验,尽管笔者前期进入了一些比拟失常的互联网公司当螺丝钉,然而也会关注研发以外的一些数据状况,并在本人的工作之余,尝试过做一些能独立上架的产品,并摸索着去经营去变现,作为本人的副业支出。 目前笔者有几个产品还在线上经营,当然也有一些因为各种起因被Google下架了,目前在经营几个产品有付费下载,有利用内购,也有广告变现,整体支出上每个月差不多有两三万港币这样,会有稳定,但整体较为安稳。至于为什么是港币,后续的文章外面也会具体解释。 某个月产品A的付费支出如下图: 综合以上的剖析比拟,独立开发是笔者认为比拟适合的副业之路,一方面工夫可控,另一方面整个支出是比拟长线的,而且下限较高,也没有外包工作各种繁琐的问题,咱们能够依照本人的想法去发明去实现,并且最终有所播种。 点点关注不迷路,更多搞钱干货公众号(曙光独立开发站)首发

May 14, 2022 · 1 min · jiezi

关于android:如何正确认识独立开发

【教你赚钱】如何正确认识独立开发多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 自我角色如何定位首先我感觉独立开发者并不能简略了解成程序员或者开发人员,其实在我的了解中,独立产品人可能是更加适合的称说。 独立开发者,意思是 “一个人开发”,或者团队很小,不同于公司外面的 “多人合作开发”。然而开发之外的事件呢,怎么经营、怎么迭代、怎么变现,这些概念都不大波及。因为可能会有,也可能没有。 开发以外的工作,如果没有的话,那么咱们所做的事件就只是整个产品过程中的一部分,代码写完,我的项目不会本人变成钱,甚至如果没有后期的需要调研和设计工作,咱们产出的都未必能称为一个我的项目,充其量就是一个Demo。到此为止,产出的货色,叫Demo,而不是 Product。Demo是面向生产者用来自娱自乐的,Product才是面向用户、面向市场的。 开发以外的工作,如果咱们做了的话,尽管最终后果也未必赚钱(这是赚钱的必要条件,不是充分条件),然而你做的事件,性质变了,因为你在做产品,而不是在搞Demo了。这算 “独立产品人”。而开发工作,也因而变成一个两头因素,它只是咱们整个我的项目中的一环,因为你能够先有想法,再现学编程,甚至把代码工作外包进来也能够,甚至小的我的项目委托敌人周末抽空搞一下也能够。 综上来说,咱们作为独立开发者,在整个我的项目流程的各个环节外面,角色都是不同的。 在我的项目初始阶段,咱们是产品经理,负责需要整顿、竞品调研,负责功能设计、原型制作;在我的项目设计阶段,咱们是设计师,负责或者参加我的项目的具体交互和UI设计;在我的项目开发阶段,咱们是研发和测试工程师,负责我的项目性能的具体实现以及功能测试;在我的项目上线阶段,咱们是产品经营,负责我的项目上线的素材筹备和流程推动;在我的项目的经营维护阶段,咱们既是研发,保障我的项目稳定性,以及实现优化迭代,也是经营,负责数据整顿反馈,也负责产品的推广、变现数据的优化进步等等等等。作为程序员,如何转向独立产品者思维升高技术在我的项目中的重要性。咱们最终用来在市场中吸引用户的,是一款产品,而不是某个代码十分优雅的Demo;一款好的产品,肯定是优先满足了用户的需要,须要更加不便好用、更加解决痛点,在这个过程中,产品的稳定性是根底条件之一,然而也仅此而已,用户不会为优雅的代码实现买单,同样的产品用户肯定会抉择更加不便好用的,而不是炫技式的性能堆砌的产物。关注产品生命周期的每个环节。产品性能很重要,交互设计也很重要,开发实现很重要,线上经营更加重要。咱们要保障咱们最终上线的不是一坨shit,更要保障就算产品是一坨shit,咱们也能把他精准的送到须要肥料的指标用户手中。数据驱动,面向盈利。接入了利用内广告,咱们的产品性能渗透率不高,用户次留差,用户评估低,怎么办?首先咱们要端正态度:咱们做利用不是来做慈悲的,咱们提供了服务,为的是获取报酬,所以,接广告嘛,挣钱嘛,不寒碜。其次是咱们须要通过各种试验比照,来剖析,到底是性能自身造成的次留差、评估低,还是广告的接入带来的这些负面影响。如果是性能问题,咱们就优化性能;如果是广告问题,咱们一方面能够优化广告策略,一方面能够给用户提供付费去广告的抉择。核心思想就是,在盈利和用户称心之间,谋求一个平衡点,争取双赢。双赢能够长久,单赢必然不行。剽窃可耻,但能够借鉴。正当的利用开源代码,能够大大缩小咱们的开发成本,大大不便咱们疾速试错的产品思路。咱们不必要纠结是否齐全原创,好的产品包装思路,好的经营策略齐全能够做到点石成金,可能满足用户需要,自身就是一种价值的发明。当然,情谊提醒,须要恪守对应代码的开源协定哈。点点关注不迷路,更多搞钱干货公众号(曙光独立开发站)首发

May 14, 2022 · 1 min · jiezi

关于android:为什么安卓应用的UI更新只由主线程来做其他线程不能更新UI

1、当利用执行沉重的工作以响应用户交互时,除非您正确实现利用,否则这种单线程模式可能会导致性能低下。具体地讲,如果界面线程须要解决所有工作,则执行耗时较长的操作(例如,网络拜访或数据库查问)将会阻塞整个界面线程。一旦被阻塞,线程将无奈分派任何事件,包含绘图事件。从用户的角度来看,利用会显示为挂起状态。更蹩脚的是,如果界面线程被阻塞超过几秒钟工夫(目前大概是 5 秒钟),用户便会看到令人腻烦的“利用无响应”(ANR) 对话框。如果引起用户不满,他们可能就会决定退出并卸载此利用。 2、此外,Android 界面工具包并非线程平安工具包。所以您不得通过工作线程操纵界面,而只能通过界面线程操纵界面。因而,Android 的单线程模式必须恪守两条规定: 不要阻塞 UI 线程不要在 UI 线程之外拜访 Android UI 工具包

May 14, 2022 · 1 min · jiezi

关于android:一起看-IO-Android-开发者不能错过的-13-件事

作者 / Maru Ahues Bouza, Director, Android Developer Relations 世界上仅有为数不多的几个平台能够帮忙开发者们轻松构建作品,并散发至寰球数十亿用户的各种设施——不仅在手机上,还有电视、汽车、平板电脑、手表等。在刚刚公布的 Google I/O 大会 上,咱们为您介绍了许多在 Android 平台充沛把握这些时机的做法,以及应用 Modern Android Development (古代 Android 开发) 解决更多通用问题,让您能更容易打造适宜日常生活中各种尺寸屏幕设施的体验。 咱们总结了 Android 开发者须要晓得的 13 件事: 从 Jetpack Compose 到平板电脑再到 Wear OS,当然还有…… Android 13!请大家持续关注 Google I/O 大会 的 内容更新,以及来自 Android 团队的 26 场技术讲座和 4 场研讨会。 Modern Android Development (古代 Android 开发)#1: Jetpack Compose Beta 1.2,反对更多高级用例Android 的古代用户界面工具包 Jetpack Compose 持续带来您所须要的 API,以反对更多的高级用例,如可下载字体、LazyGrids、窗口边衬区、嵌套滚动互操作,以及更多的工具反对,如实时编辑 (LiveEdit)、重绘调试 (Recomposition Debugging) 和动画预览 (Animation Preview)。请浏览 文章 理解详细信息。 ...

May 13, 2022 · 2 min · jiezi

关于android:使用-Agora-为Android-APP添加视频直播

add-live-streaming-to-your-android-app-using-agora-featured1024×512 121 KB 视频互动直播是以后比拟热门的玩法,咱们常常见到有PK 连麦、直播答题、一起 KTV、电商直播、互动大班课、视频相亲等。 本文将演示如何通过声网Agora 视频 SDK 在 Android 端实现一个视频直播利用。注册声网账号后,开发者每个月可取得 10000 分钟的收费应用额度,可实现各类实时音视频场景。 话不多说,咱们开始入手实操。 一些前提条件Agora 开发者帐户(声网开发者注册指南)Android StudioAndroid 开发基础知识一、 通过开源Demo,体验视频直播可能有些人,还不理解咱们要实现的性能最初是怎么的。所以咱们在 GitHub上提供一个开源的根底视频直播示例我的项目,在开始开发之前你能够通过该示例我的项目体验视频直播的体验成果。Github:GitHub - Meherdeep/agora-android-live-streaming 1 588×1228 79.9 KB 在这里,我增加了两个直播流,同时能够让多个观众订阅它。 二、 视频直播的技术原理咱们在这里要实现的是视频直播,Agora 的视频直播能够实现互动成果,所以也常常叫互动直播。你能够了解为是多个用户通过退出同一个频道,实现的音视频的互通,而这个频道的数据,会通过声网的 Agora SD-RTN 实时网络来进行低延时传输的。 须要特地阐明的是,Agora互动直播不同于视频通话。视频通话不辨别主播和观众,所有用户都能够发言并看见彼此;而互动直播的用户分为主播和观众,只有主播能够自在发言,且被其余用户看见。下图展现在 App 中集成 Agora 互动直播的根本工作流程: 实现互动直播的步骤如下:1.设置角色:互动直播频道中,用户角色能够是主播或者观众。主播在频道内公布音视频流,观众仅可订阅音视频流。 2.获取 Token:当 App 客户端退出频道时,你须要通过 Token 验证用户身份。App 客户端向 App 服务器发送申请,并获取 Token,而后在客户端退出频道时验证用户身份。 3.退出频道:调用 joinChannel 创立并退出频道。应用同一频道名称的 App 客户端默认退出同一频道。 4.在频道内公布和订阅音视频:退出频道后,角色为主播的 App 客户端能够公布音视频。对于角色为观众的客户端,如果想要公布音视频,能够调用 setClientRole 切换用户角色。 App 客户端退出频道须要以下信息:频道名称:用于标识直播频道的字符串。App ID:Agora 随机生成的字符串,用于辨认你的 App,可从 Agora 控制台获取,(Agora控制台链接:Dashboard用户ID:用户的惟一标识。你须要自行设置用户 ID,并确保它在频道内是惟一的。Token:在测试或生产环境中,你的 App 客户端会从你的服务器中获取 Token。为不便疾速测试,你也能够获取长期 Token。长期 Token 的有效期为 24 小时。三、 开发环境声网Agora SDK 的兼容性良好,对硬件设施和软件系统的要求不高,开发环境和测试环境满足以下条件即可:• Android SDK API Level >= 16• Android Studio 2.0 或以上版本• 反对语音和视频性能的真机• App 要求 Android 4.1 或以上设施 ...

May 13, 2022 · 4 min · jiezi

关于android:一起看-IO-Android-13-Beta-2-现已发布

作者 / Dave Burke, VP of Engineering 在 Google I/O 大会上,咱们为开发者们介绍了迄今为止的各种新进展。其中就包含咱们明天公布的 Android 13 的第二个 Beta 版,供大家进行测试和提交反馈。驱动咱们推出 Beta 版打算的能源,是凋谢的理念以及咱们与社区 (也就是大家) 的松软单干,是大家帮忙 Android 成为更适宜每一个人的平台。这里咱们要感激大家迄今为止所提供的反馈! Android 13 持续聚焦于咱们的 外围主题: 隐衷和平安,以及开发者生产力。咱们新增了一个发送告诉的权限,一个用于爱护隐衷的照片选择器,还改良了与左近设施配对和拜访媒体文件时的权限。当初为单个利用进行语言设置变得更加容易,您的利用图标能够和用户抉择的主题色彩相匹配,这个版本反对不少现代化规范,如 HDR 视频、蓝牙低功耗音频 (LE Audio) 以及通过 USB 连贯 MIDI 2.0 硬件。咱们还将持续致力于让 Android 在平板电脑和大屏幕设施上成为更好的操作系统,为您提供 更好的工具,助力您笼罩 2.7 亿台沉闷的大屏幕 Android 设施。您能够在咱们的 这篇博文 中浏览更多对于 Android 13 的信息。 不管您是想体验 Android 13 的性能、测试利用还是 提交反馈,都能够从这次的 Beta 2 开始。只需 应用受反对的 Pixel 设施注册加入测试,即可通过 OTA 形式取得 Beta 2 和接下来的更新。如果您之前曾经装置过 Android 13 的预览版或 Beta 版,您将主动取得 Beta 版更新。 ...

May 13, 2022 · 1 min · jiezi

关于android:教你赚钱5分钟成为副业致富的独立开发者

多年兼职独立开发者,Google Play付费利用月支出30k+。 超级干货分享,帮你赚到工资之外的睡后支出。 个人经历笔者是某强二线互联网公司Android开发一枚,在国内互联网内卷大环境下还有稳固双休,心怀感恩。利用业余时间在Google Play经营本人开发的App,主力产品累计付费下载50K+,最高的时候在Google Play美国区付费总榜排第八。目前副业支出税后月均20k左右,再次感恩。 独立开发产品作为副业,在以后这种经济环境下,是我集体缓解压力的一个路径,通过我一段时间的实际,我发现一个产品从构思到实现再到盈利,并不是十分难以实现的事件,很多内容其实你如果理解了,你就会发现还是可能经过努力来实现的。 能力变现,可能只须要多点认知,并致力。 某个月产品A的付费支出如下图: 实战干货以下内容面向的人群互联网行业从业人员,产品、设计、研发或者经营,甚至也不须要是互联网行业从业人员,只有你有一个做副业的想法,并且是一个有足够口头力的人,都能够来尝试着做一个本人现实中的App,用这个App来解决一些问题或者提供简略的服务,并试着用它来赚取本人的睡后支出。 我只会开发,也能做独立App么同样的问题,我只是产品,不会设计和开发;或者我只会设计,不懂产品和研发,我能做独立App么,答案在我看来是一样的:能够。因为很多时候,咱们没做成某件事情,不是咱们做不了,而是咱们没尝试去做。 比方,我只会开发,然而我必定有相熟的产品和设计,日常工作中也能够通过本人的学习,来大抵理解这些工作,那么做起来无非就是熟练度的问题。而且对于Android开发者来说,设计方面Google官网的Material Design或者最新的Material You都是能够疾速上手实现的抉择。 至于只是产品或者设计,不会研发,那齐全能够找个靠谱的研发老哥来外包开发嘛。笔者本人的产品,也不全是一个人手撸所有,全干工程师尽管设想很美妙,但理论做起来常常会力有不逮,为了更好的产品成果,我会把设计工作外包给相熟的设计师敌人,毕竟业余的人做业余的事件,产品的胜利就会更有保障。 我不晓得做什么App,怎么去挖掘咱们每天都在应用各种各样的App,接触各种各样的人或者事物,看到各种新闻,某些利用应用过程中的苦楚,或者共事敌人不经意的探讨,都有可能灵光一闪成为咱们的奇思妙想。 笔者自己的教训就是多关注一些科技互联网类的新闻,多用产品思维去掂量一些事物,比方共事会强烈的探讨昨天的球赛,那么咱们能不能做个查问足球比分的利用?什么,这样的利用遍地都是?那么咱们能不能去做一些差异化的体验?竞品大而全,那么咱们就小而美好不好?竞品都是足球的关键字,咱们做世界杯行不行? 有了一个奇思妙想之后,咱们须要做的是用产品的思维掂量咱们的这个好点子,是否值得去落地。 首先它是否解决某些问题或者满足某些需要,比方咱们想做一个世界杯较量比分查看的利用,它的次要性能就是让用户可能疾速地看到某场较量的赛果。 其次是这个好点子的指标人群是否够大,是否会有足够的用户来买单,是否可能通过某些热点事件来轻松地获取用户。还是世界杯较量比分的利用,足球自带流量,世界杯四年一次,同样具备话题性,指标用户能够是球迷也能够是凑热闹的伪球迷,整体基数十分宏大。 再次是这个好点子是不是竞争强烈,毕竟当初不比十年前,轻易做个利用都大概率没什么竞争,同样是较量比分查看的利用,当初国内的懂球帝、直播吧国外的FIFA都做了很久,岂但性能齐全而且用户覆盖面很广,那咱们的“好点子”还是有实现的必要么?或者说,咱们能不能通过本身的思考,来通过差异化的性能出奇制胜? 如果通过以上的思考掂量,咱们的好点子的确十分不错:满足一部分人的理论需要,并且在某些方面有本人独特的竞争力,那么接下来就是去思考我的项目的落地了。 我有一个好点子,怎么落地一个简化的App开发流程是:想法->产品需要文档->交互原型->设计还原->研发实现->上线迭代,你可能是其中某一环的从业人员,也可能是个真正意义上的小白,然而无论你的角色是什么,你只有依照这个流程,一步一步地去实现,那么最终都会有一个产品诞生。对于这一整个流程,笔者后续打算用多篇文章,从每一环具体的去介绍,这里就不开展解说了。 App做进去没有用户怎么办很多程序员出身的独立开发者都会有这个问题,信念满满辛辛苦苦把利用做了进去,好不容易通过审核上架了商店,后果就是无人问津,看着个位数的下载,感觉一腔热血被这个世界辜负了,痛觉无爱。 其实这个状况的呈现是因为咱们只晓得开发,不晓得推广经营,是否在我的项目冷启的时候获取第一批种子用户,关系到App后续的生死存亡。那么用户从哪来呢,个别有以下几种路径: 天然量利用自身自带热点或者和某些热点强关联,比方世界杯,比方足球,比方元宇宙,比方NFT,那么这些利用在商店里就有更大的概率曝光,被感兴趣的用户搜寻到,从而获取天然量。然而通常较大的热点也意味着较大的竞争,毕竟热点之所以是热点,就是因为有大部分人的关注,这是一把双刃剑。 如果你能发掘出竞争较少的热点,那就等于是胜利了一半,因而提前布局就显得较为要害。 自有产品矩阵导量这一点适宜比拟成熟的开发者或者组织,外部曾经有多款利用,那么能够做一些援用之间相互疏导的工作,当然在Google Play平台,须要为导量的利用(两个利用性能之间无显著关联)减少广告标识,否则可能会被判利用违规。 付费获客这一条顾名思义就是花钱去做广告获取用户,也是笔者较为罕用的一个产品冷启动获取用户的办法,利用Google Ads平台,投放利用装置广告,通常能较为疾速地获取第一批用户,这对利用稳定性的验证以及后续商店ASO都有较大的帮忙。 促销流动这一条局限性较大,只能用于付费下载利用,Google Play容许开发者每隔30天发动一次促销流动,如果你是付费用户,能够在流动期间将利用打折发售,甚至能够打骨折让用户收费下载,通常在这期间利用会有不错的下载量。 独立App怎么赚钱付费下载顾名思义,这种模式下用户必须付费能力下载安装利用,这种形式益处是能保障单个用户的价值较高,害处是会大大提高用户的下载门槛,十分考验利用对用户的吸引力,毕竟用户须要实实在在地付出真金白银。笔者目前的营收主力产品就是付费下载,个核心酸,会在后续文章中缓缓道来。 利用内购利用内购就是用户能够收费地下载利用,然而须要为某些特定的性能付钱,如果咱们的利用采取这种盈利模式,就须要思考哪些性能会是用户违心花钱的中央。 利用内广告置信大家都在本人用过的利用内看过广告,这是目前大多数App的盈利形式,并不间接从用户手里赚钱,反而是通过接入如Google Admob或者国内的广点通穿山甲之类的广告平台,来从广告商那里赚取广告费,常见的利用内广告格局有Banner、插屏、开屏、原生以及激励视频等。能够说是否理解广告接入很大水平上决定了咱们的利用是否是白忙一场。笔者后续也会在变现相干的文章外面系统地论述这部分内容。 点点关注不迷路,更多搞钱干货公众号首发

May 12, 2022 · 1 min · jiezi

关于android:Android-13-亮相谷歌IO大会OPPO-首批推出开发者预览版

北京工夫 5 月 12 日,谷歌I/O开发者大会正式公布 Android 13 操作系统。时隔四年,再度回归“甜品”代号的 Android 13 在隐衷权限、性能便捷性等方面进行改良,带来更为杰出的应用体验。 历代安卓零碎的跨版本更新也是对各大手机厂商和开发者们的一次考验。是否最先品味“甜品”,成为国内安卓手机品牌展现“技术家底”的一次好机会。据悉,OPPO 始终走在适配最新 Android版本前列,间断三年稳居第一营垒,在零碎跨版本更新方面积攒了丰富的教训。 OPPO 首批推出开发者预览版,三大适配反对再降级不出所料,往年 OPPO 再次首批推出基于 Android 13 Beta 开发的 ColorOS 开发者预览版,OPPO Find N、OPPO Find X5 Pro 两款机型率先反对。OPPO 还将自家三大适配反对再度降级,围绕工具反对、技术支持、交流活动为开发者搭建全流程多元化的适配服务体系。(开发者预览版仅供开发者适配应用, 不倡议非开发者用户降级。) 提供收费云真机服务,帮忙开发者降本增效晚期适配工作中,真机测试是排查共性问题的要害。OPPO 为开发者提供了收费应用的云真机,反对近程调测且适用范围更广,可能运行模仿实在用机体验中的各种场景,疾速验证适配后果,为开发者适配工作降本增效 。此外,OPPO 还对近程真机服务再度降级,图像传输更加稳固,整体操作也更加晦涩。 适配指引继续更新,专人帮助解答适配问题跨版本零碎适配须要 OPPO 与开发者的严密合作。OPPO 开放平台官网为开发者提供了Android 13 适配指引文档并继续更新。OPPO 通过总结过往适配教训并联合 Android 13 新个性,提前预判开发者可能遇到的问题,针对性给出解决方案。开发者还能够通过适配 FAQ 专栏、适配答疑交换社群、OPPO 开放平台官网技术社区的适配专区等多元渠道,查阅信息、沟通交流、获取答疑等来进步适配效率。 举办新一期 OTalk,在线沟通解答难题除了提供多渠道的技术支持,OPPO 还将在 5 月底再度举办针对适配的「OTalk」线上交换专场。交流活动将聚焦Android 13适配工作,邀请 OPPO 高级零碎工程师与开发者在线交换,针对 Android 13 新个性以及开发者适配过程中的共性难题进行探讨。 值得关注的是,OPPO 也对外颁布了其残缺的适配打算。能够看到,将来三个月OPPO将有序推动适配工作。晦涩的零碎与利用体现是用户体验的根底,开发者能够关注「OPPO开放平台」公众号,及时获取官网信息,确保在公测前实现利用适配。

May 12, 2022 · 1 min · jiezi

关于android:KotlinKCP的应用第二篇

前言接Kotlin-KCP的利用-第一篇,本文是第二篇,以下是本文的指标: 记录如何简略搭建 KCP 开发环境应用 KCP 解决第一篇中的问题何为KCP?为何不应用KSP?KSPKSP 即 Kotlin Symbol Processing(Kotlin符号处理器),KSP 目前只能生成代码,不能批改字节码,第一篇中的问题须要批改字节码,因而 KSP 不能满足需要 KCPKCP 即 Kotlin Compiler Plugin(Kotlin编译器插件),在 kotlinc 过程中提供 hook 机会,在此期间能够生成代码、批改字节码等 规范的 KCP 架构如下1: PluginGradle 插件,与 Kotlin 无关,在 build.gradle 脚本中提供一个入口通过 Gradle 扩大设置配置信息Subplugin介于 Gradle 和 Kotlin 间接的 APIs 接口读取 Gradle 扩大配置信息并写入 SubpluginOptions定义编译器插件的惟一ID定义 Kotlin 插件的 Maven 坐标信息,便于编译器下载它CommandLinProcessor设置 Kotlin 插件惟一 ID读取 kotlinc -Xplugin 参数读取 SubpluginOptions 配置信息,并写入 CompilerConfigurationKeysComponentRegistrar读取 CompilerConfigurationKeys注册 Extension 到各编译流程Extension生成代码批改字节码多种类型的扩大,比方 ExpressionCodegenExtensionClassBuilderInterceptorExtensionStorageComponentContainerContributorIrGenerationExtension实现KCP指标依据 KCP 的架构,上面一一进行实现 上图是本仓库架构,旨在通过 KCP 在 Java 字节码中 @Hide 注解指标上设置 ACC_SYNTHETIC 标识,使其在 Java 中不能失常调用,达到暗藏 API 的成果 ...

May 12, 2022 · 5 min · jiezi

关于android:调用推送接口返回成功手机端未收到通知栏消息该如何自检

一、问题场景某位开发者调用API接口推送音讯,申请返回:{"code": "80000000","msg": "Success","requestId": "16233092**287602020201"}。返回"code": "80000000"示意该申请是胜利的,然而手机端未收到告诉栏音讯。 二、起因剖析排查首先能够排查音讯体中是否存在以下几种字段使用不当的状况: 状况1: validate_only的值是truevalidate_only字段管制以后是否为测试音讯,测试音讯只做格局合法性校验,不会推送至用户设施。也就是说validate_only值为true时,即便申请返回"code": "80000000",服务器也不会给端侧推送音讯。 状况2:没有应用notification字段音讯体中有message.data,没有message.notification和message.android.notification,音讯类型为透传音讯。透传音讯透传给利用,不会在告诉栏展现。 状况3:foreground_show的值是falseforeground_show管制前台利用的告诉解决,当该值被设置为“false”且利用在前台时,告诉音讯的全部内容将会通过onMessageReceived(RemoteMessage message)办法传递给利用,不展现告诉栏音讯。 前台利用的告诉解决参考文档 如以上3种状况都不合乎,可应用Push自助剖析性能查问音讯发送状况:登录AppGallery Connect网站,点击“我的我的项目”,在我的项目列表中找到本人的我的项目,通过“增长 > 推送服务 > 自助剖析(Beta)”页签进入。 输出发送音讯时的“token”和推送服务返回的“requestId”后,点击查问按钮即可查看音讯发送状况。 这下面的音讯记录更新的比较慢,如果未查问到音讯解决,请在推送申请半小时后再查问。Push自助剖析参考文档 如果按以上排查步骤仍未能找到起因,请查看技术支持文档。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 12, 2022 · 1 min · jiezi

关于android:最长支持5小时实时语音转写直播也能同步字幕

信息暴发时代,有效率有品质地整顿视频、音频、文字等信息变得尤为重要。会议、讲座、采访、客服电话等场景均须要造成残缺的文字记录资料,音视频文件也要配有字幕。语音转文字的智能化,让信息录入即时高效。 在直播类、会议类、笔记类的利用中都具备实时语音转写性能。例如,在音视频会议中,能够将发言内容可视化,即时生成会议纪要,不便记录、批改,进步会议效率;在直播类利用中,能够辨认主播所说的话,达到“边说边出文字”的成果,晋升用户观看体验,营造更好的直播气氛;在笔记类利用中,反对重点内容随讲随记,捕获你的每一个想法。 HMS Core机器学习服务提供实时语音转写能力,让开发者在利用中构建长语音转文字性能。能够将会议记录、笔记、总结、音视频直播内容等音频流实时转换为文字流数据后果,实现即时对语音内容的辨认,展示对应文字内容。 最高可反对5小时的实时长语音输入转换为文本,不仅可能输入标点符号,同时能够生成带有工夫戳的文本信息。不论你是中文普通话、英语、法语,甚至中英文混说都可能很好辨认,满足不同的场景须要。 实时语音转写部署状况 成果展现 在成果展现里咱们能够看到通过实时语音转写性能转成的文字在完结后能够即刻进行编辑、复制、批改等,非常不便。 注意事项• 目前法语实时语音转写服务仅反对华为手机和光荣手机应用,中英文实时语音转写服务反对所有品牌手机。 • 实时语音转写服务通过拜访云侧接口实现辨认服务,调测和应用时需保障设施可失常拜访互联网。 开发步骤1 .在AppGallery Connect中配置相干信息。在开发利用前,须要在AppGallery Connect中配置相干信息。 具体开发筹备能够参考文档 2 .配置HMS Core SDK的Maven仓地址。2.1 关上Android Studio我的项目级“build.gradle”文件。 2.2 增加HUAWEI agcp插件以及Maven代码库。 在allprojects->repositories外面配置HMS Core SDK的Maven仓地址。 allprojects { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }在buildscript->repositories外面配置HMS Core SDK的Maven仓地址。buildscript { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }在buildscript ->dependencies外面减少配置。 buildscript{ dependencies { classpath 'com.huawei.agconnect:agcp:1.3.1.300' } }3 .创立语音识别器,并设置配置。MLSpeechRealTimeTranscriptionConfig config = new MLSpeechRealTimeTranscriptionConfig.Factory() // 设置语言,目前反对中文、英语、法语转写。 .setLanguage(MLSpeechRealTimeTranscriptionConstants.LAN_ZH_CN) // 设置标点。 .enablePunctuation(true) // 设置句子的偏移。 .enableSentenceTimeOffset(true) // 设置词的偏移。 .enableWordTimeOffset(true) .create();MLSpeechRealTimeTranscription mSpeechRecognizer = MLSpeechRealTimeTranscription.getInstance();4. 创立语音辨认后果监听器回调。// 回调实现MLSpeechRealTimeTranscriptionListener接口,实现接口中的办法。Protected class SpeechRecognitionListener implements MLSpeechRealTimeTranscriptionListener{ @Override public void onStartListening() { // 录音器开始接管声音。 } @Override public void onStartingOfSpeech() { // 用户开始讲话,即语音识别器检测到用户开始讲话。 } @Override public void onVoiceDataReceived(byte[] data, float energy, Bundle bundle) { // 返回给用户原始的PCM音频流和音频能量,该接口并非运行在主线程中,返回后果须要在子线程中解决。 } @Override public void onRecognizingResults(Bundle partialResults) { // 从MLSpeechRealTimeTranscription接管到继续语音辨认的文本。 } @Override public void onError(int error, String errorMessage) { // 辨认产生谬误后调用该接口。 } @Override public void onState(int state,Bundle params) { // 告诉利用状态产生扭转。 }}5. 绑定语音识别器。mSpeechRecognizer.setRealTimeTranscriptionListener(new SpeechRecognitionListener());6 .调用startRecognizing启动语音辨认。mSpeechRecognizer.startRecognizing(config);7. 辨认实现后,完结辨认并开释资源。if (mSpeechRecognizer!= null) { mSpeechRecognizer.destroy();}理解更多详情>>拜访机器学习服务联盟官网获取机器学习服务开发领导文档拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee ...

May 11, 2022 · 1 min · jiezi

关于android:Android长按图标展示快捷方式

长按桌面图标展现快捷方式,今时看来,早已司空见惯,一是Android很早的版本就曾经反对,二是大部分的利用也曾经实现,像微信,支付宝,头条等,所以无论性能还是实现形式,都曾经踊跃出了大量的技术博文,但细细看去,却很少有一个对立的流程及具体的实现计划,本文针对此性能做了粗疏的总结,一是,便于日后开发的须要,二是,心愿能够帮忙到有相似需要的小伙伴。 这个个性,能够追溯到Android 7.1,也就是在7.1之后的零碎,如果app反对,能够通过长按app图标展现一些快捷操作,如下图: 置信上图中的性能,大家都见过,那么如何实现呢?Android API当中给出了两种实现形式,一种是动态,一种是动静, 动态形式:动态的形式,须要xml资源,以shortcuts标签的模式引入,字面意思咱们不言而喻,就是捷径标签。 简略两步就能够实现,第一步,在res目录下,新建xml目录,而后创立对应的xml资源。 <?xml version="1.0" encoding="utf-8"?><shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@mipmap/ic_launcher" android:shortcutId="test_0" android:shortcutShortLabel="@string/app_test_0"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.abner.widget.Test0Activity" android:targetPackage="com.abner.widget" /> <categories android:name="android.shortcut.conversation" /> <capability-binding android:key="actions.intent.CREATE_MESSAGE" /> </shortcut> <shortcut android:enabled="true" android:icon="@mipmap/ic_launcher" android:shortcutId="test_1" android:shortcutShortLabel="@string/app_test_1"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.abner.widget.Test1Activity" android:targetPackage="com.abner.widget" /> <categories android:name="android.shortcut.conversation" /> <capability-binding android:key="actions.intent.CREATE_MESSAGE" /> </shortcut></shortcuts>外层首先一个shortcuts标签, 外面就是包裹着一个一个快捷方式shortcut,你须要几个,就创立几个,下面代码中我是创立了两个,能够发现这些属性和咱们清单文件里的Activity里的属性相似,这里简略概述一下: enabled, 示意这个shortcut是否可用icon 为快捷图标shortcutId, 快捷方式惟一的idshortcutShortLabel, 短名称shortcutLongLabel, 这里是配置的长名称, launcher会优先选择长名称显示,显示不下会抉择短名称categories 为应用程序的快捷方式执行的操作类型提供分组,例如创立新的聊天音讯capability-binding 可选 申明与此快捷方式关联的性能。CREATE_MESSAGE 申明的性能,是与利用无关的 Action 内置 intent。用户能够联合应用语音指令与 Google 助理来调用此快捷方式。在shortcut标签下,还有一个intent标签,不用说,想必大家也晓得了它的作用,就是点击快捷方式,跳转的指标。 intent, 这里示意咱们点击shortcut时要干嘛, targetPackage是指定一个指标利用的包名, targetClass是咱们要跳转的指标类, 这里要留神的是android:action肯定要配置, 否则会解体categories, 这个货色目前地位官网只给提供了android.shortcut.conversation第二步,清单文件AndroidManifest里进行配置,这个须要留神一下:只能在有action是android.intent.action.MAIN和category是android.intent.category.LAUNCHER的Activity中配置才无效,说简略点,也就是利用的主入口。 <!--引入shortcuts资源--><meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />以上两步实现之后,咱们就能够运行程序,成果如下: ...

May 10, 2022 · 1 min · jiezi

关于android:修改linphonesdkandroid第四篇

背景在应用linphone-sdk-android过程中,发现当有一起呼叫在通话中时,又收到一起呼叫,会莫名其妙的播报振铃声音,问题是曾经调用linphone-sdk-android提供的接口敞开了振铃声音 // 敞开RingmCore.setRing(null);mCore.setRingback(null);mCore.setRemoteRingbackTone(null);mCore.setNativeRingingEnabled(false);mCore.setRingDuringIncomingEarlyMedia(false);mCore.setVibrationOnIncomingCallEnabled(false);// 敞开CallErrorToneReason[] reasons = Reason.values();for (Reason reason : reasons) { mCore.setCallErrorTone(reason, null);}// 敞开ToneIdToneID[] toneIds = ToneID.values();for (ToneID toneId : toneIds) { mCore.setTone(toneId, "");}剖析查看Logcat输入的日志,剖析发现有ToneManager、doStartRingtone等关键词 13056-13056/com.guodong.android.linphone I/liblinphone: [ToneManager] [0x934e70ac] state changed : [None, LinphoneCallIncomingReceived]13056-13056/com.guodong.android.linphone I/liblinphone: [ToneManager] add new session [0x934e70ac]13056-13056/com.guodong.android.linphone I/liblinphone: [ToneManager] doStopToneToPlaySomethingElse13056-13056/com.guodong.android.linphone I/liblinphone: [ToneManager] doStartRingtone13056-13056/com.guodong.android.linphone I/liblinphone: [ToneManager] doStartNamedTone [2]关上IDE去源码中搜寻一番,发现tone-manager.cpp,在其中找到doStopToneToPlaySomethingElse、doStartRingtone、doStartNamedTone办法,与Logcat日志输入吻合 void ToneManager::doStopToneToPlaySomethingElse(const std::shared_ptr<CallSession> &session) { lInfo() << "[ToneManager] " << __func__; if (isAnotherSessionInState(session, State::Tone)) { doStopTone(); }}void ToneManager::doStartRingtone(const std::shared_ptr<CallSession> &session) { lInfo() << "[ToneManager] " << __func__; LinphoneCore *lc = getCore()->getCCore(); // 如果有一个正在通话的呼叫就调用`doStartNamedTone` if (isAnotherSessionInState(session, State::Call)) { /* play a tone within the context of the current call */ doStartNamedTone(session, LinphoneToneCallWaiting); } else { MSSndCard *ringcard = lc->sound_conf.lsd_card ? lc->sound_conf.lsd_card : lc->sound_conf.ring_sndcard; if (ringcard && !linphone_core_is_native_ringing_enabled(lc)) { if (!linphone_core_callkit_enabled(lc)){ ms_snd_card_set_stream_type(ringcard, MS_SND_CARD_STREAM_RING); linphone_ringtoneplayer_start(lc->factory, lc->ringtoneplayer, ringcard, lc->sound_conf.local_ring, 2000); }else{ ms_message("Callkit is enabled, not playing ringtone."); } } }}void ToneManager::doStartNamedTone(const std::shared_ptr<CallSession> &session, LinphoneToneID toneId) { lInfo() << "[ToneManager] " << __func__ << " [" << Utils::toString(toneId) << "]"; LinphoneToneDescription *tone = getToneFromId(toneId); // 在Java中已将audiofile置为"",所以会走else分支 if (tone && tone->audiofile) { playFile(tone->audiofile); } else { // 此处生成振铃声音 MSDtmfGenCustomTone dtmfTone = generateToneFromId(toneId); playTone(session, dtmfTone); }}好的,当初先找到调用doStopToneToPlaySomethingElse的办法,在IDE中查找,发现startRingtone办法 ...

May 10, 2022 · 2 min · jiezi

关于android:修改linphonesdkandroid下篇

前言接上篇批改linphone-sdk-android-上篇 接中篇批改linphone-sdk-android-中篇 本文是下篇,本篇记录在上篇中提到的问题1排查过程及修复计划,尽量形容排查问题过程中的思路与方向 上篇中说问题1当初认为是linphone的bug,前面看源码及查资料发现可能不是bug,本篇将记录集体的了解 问题这里再形容下问题1:关上音频编解码G722、G729等时,发动呼叫的INVITE SDP中,没有G722、G729的rtpmap m=audio 7078 RTP/AVP 96 0 8 9 18 101 97a=fmtp:18 annexb=yesa=rtpmap:101 telephone-event/48000a=rtpmap:97 telephone-event/8000a=rtcp-fb:* trr-int 1000a=rtcp-fb:* ccm tmmbr剖析这里先理解下SDP协定,参考The Session Description Protocol (SDP) (3cx.com) rtpmap是Session attribute lines,即为会话属性行,是对Payload Type的补充阐明,Payload Type既是m=audio 7078 RTP/AVP 96 0 8 9 18 101 97中AVP前面的数字,这些数字是音频编解码对应的代码,对应关系如下: 下表源自Real-Time Transport Protocol (RTP) Parameters (iana.org) PT Encoding Name Audio/Video (A/V) Clock Rate (Hz) Channels Reference 0PCMUA80001[RFC3551]1Reserved 2Reserved 3GSMA80001[RFC3551]4G723A80001[Vineet_Kumar][RFC3551]5DVI4A80001[RFC3551]6DVI4A160001[RFC3551]7LPCA80001[RFC3551]8PCMAA80001[RFC3551]9G722A80001[RFC3551]10L16A441002[RFC3551]11L16A441001[RFC3551]12QCELPA80001[RFC3551]13CNA80001[RFC3389]14MPAA90000 [RFC3551][RFC2250]15G728A80001[RFC3551]16DVI4A110251[Joseph_Di_Pol]17DVI4A220501[Joseph_Di_Pol]18G729A80001[RFC3551]19ReservedA 20UnassignedA 21UnassignedA 22UnassignedA 23UnassignedA 24UnassignedV 25CelBV90000 [RFC2029]26JPEGV90000 [RFC2435]27UnassignedV 28nvV90000 [RFC3551]29UnassignedV 30UnassignedV 31H261V90000 [RFC4587]32MPVV90000 [RFC2250]33MP2TAV90000 [RFC2250]34H263V90000 [Chunrong_Zhu]35-71Unassigned? 72-76Reserved for RTCP conflict avoidance [RFC3551]77-95Unassigned? 96-127dynamic? [RFC3551]从表中理解到,Payload Type(PT) code 0 - 95为动态类型,即code对应固定的codec(编解码器),96 - 127为动静codec,即须要在SDP协商过程中确定 ...

May 10, 2022 · 5 min · jiezi

关于android:修改linphonesdkandroid中篇

前言接上篇批改linphone-sdk-android-上篇 本文是中篇,本篇记录问题2的后续排查过程及修复计划,尽量形容排查问题过程中的思路与方向 剖析上篇说到减少日志,编译后放到AS中运行,查看Logcat输入 // up不为NULL2022-04-24 18:10:36.969 4002-4018/com.guodong.android.linphone D/guodongAndroid: up = 0x1004332022-04-24 18:10:36.969 4002-4018/com.guodong.android.linphone D/guodongAndroid: up_available1 = 02022-04-24 18:10:36.969 4002-4018/com.guodong.android.linphone D/guodongAndroid: up_available2 = 0// up为NULL2022-04-24 18:10:39.669 4002-4018/com.guodong.android.linphone D/guodongAndroid: up = 0x02022-04-24 18:10:39.669 4002-4018/com.guodong.android.linphone D/guodongAndroid: up_available1 = 12022-04-24 18:10:39.669 4002-4018/com.guodong.android.linphone D/guodongAndroid: up_available2 = 1从日志中能够看出,有时up是NULL的,猜测有销毁的办法,再次查看linphone_jni.cc,发现有一个unref办法: JNIEXPORT jboolean JNICALL Java_org_linphone_core_LoggingServiceImpl_unref(JNIEnv* env, jobject thiz, jlong ptr) { LinphoneLoggingService *cptr = (LinphoneLoggingService*)ptr; if (cptr == 0) { bctbx_error("Java_org_linphone_core_LoggingServiceImpl_unref's LinphoneLoggingService C ptr is null!"); return TRUE; } jobject wref = (jobject)belle_sip_object_data_get((belle_sip_object_t *)cptr, belle_sip_java_user_data_key); belle_sip_object_data_set((belle_sip_object_t *)cptr, belle_sip_java_user_data_key, nullptr, nullptr); if (wref) { env->DeleteWeakGlobalRef(wref); } return belle_sip_object_unref_2(cptr) == 1;}嗯,看来这个就是销毁办法了,通过belle_sip_object_data_get办法取出值,再通过belle_sip_object_data_set办法设置为nullptr,而后删除全局弱援用 ...

May 10, 2022 · 3 min · jiezi

关于android:修改linphonesdkandroid上篇

前言记录批改linphone-sdk-android过程,打算分为上、中、下三篇 本文是上篇,本篇仅记录下书问题2的初步排查过程,尽量形容排查问题过程中的思路与方向 余下两篇记录问题1、2的批改过程 背景接上文编译linphone-sdk-android 我的项目中应用的linphone-sdk-android版本为4.5.x,应用过程中发现以下两个问题: 关上音频编解码G722、G729时,发动呼叫的INVITE SDP中,没有G722、G729的RTP MAP,过后认为是linphone的bug,前面看源码及查资料发现可能不是bug,这里先按下不表应用sdk提供的JavaLogger输入日志时,伪代码:mFactory.getLoggingService().addListener(mAndroidLoggingService);,偶现JNI解体问题 --------- beginning of crash2022-04-11 14:16:22.350 1142-1430/? A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 1430 (RealLinphonePro)2022-04-11 14:16:22.441 3756-3756/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***2022-04-11 14:16:22.442 3756-3756/? A/DEBUG: Build fingerprint: 'Android/rk3288/rk3288:7.1.2/NHG47K/builde03162201:userdebug/test-keys'2022-04-11 14:16:22.444 3756-3756/? A/DEBUG: Revision: '0'2022-04-11 14:16:22.446 3756-3756/? A/DEBUG: ABI: 'arm'2022-04-11 14:16:22.447 3756-3756/? A/DEBUG: pid: 1142, tid: 1430, name: RealLinphonePro >>> com.guodong.android.linphone <<<2022-04-11 14:16:22.448 3756-3756/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------2022-04-11 14:16:22.454 3756-3756/? A/DEBUG: Abort message: 'art/runtime/indirect_reference_table.cc:80] JNI ERROR (app bug): accessed deleted WeakGlobal 0x21ab'2022-04-11 14:16:22.456 3756-3756/? A/DEBUG: r0 00000000 r1 00000596 r2 00000006 r3 000000082022-04-11 14:16:22.457 3756-3756/? A/DEBUG: r4 89aff978 r5 00000006 r6 89aff920 r7 0000010c2022-04-11 14:16:22.459 3756-3756/? A/DEBUG: r8 00000043 r9 aaa7eef0 sl 0000000a fp 89d044002022-04-11 14:16:22.461 3756-3756/? A/DEBUG: ip 0000000b sp 89afef88 lr ab175857 pc ab1780c0 cpsr 600b00102022-04-11 14:16:22.509 3756-3756/? A/DEBUG: backtrace:2022-04-11 14:16:22.511 3756-3756/? A/DEBUG: #00 pc 0004a0c0 /system/lib/libc.so (tgkill+12)2022-04-11 14:16:22.512 3756-3756/? A/DEBUG: #01 pc 00047853 /system/lib/libc.so (pthread_kill+34)2022-04-11 14:16:22.514 3756-3756/? A/DEBUG: #02 pc 0001d8b5 /system/lib/libc.so (raise+10)2022-04-11 14:16:22.515 3756-3756/? A/DEBUG: #03 pc 00019401 /system/lib/libc.so (__libc_android_abort+34)2022-04-11 14:16:22.517 3756-3756/? A/DEBUG: #04 pc 00017048 /system/lib/libc.so (abort+4)2022-04-11 14:16:22.518 3756-3756/? A/DEBUG: #05 pc 0031d8cd /system/lib/libart.so (_ZN3art7Runtime5AbortEPKc+328)2022-04-11 14:16:22.520 3756-3756/? A/DEBUG: #06 pc 000b5503 /system/lib/libart.so (_ZN3art10LogMessageD2Ev+1134)2022-04-11 14:16:22.521 3756-3756/? A/DEBUG: #07 pc 001bd0ff /system/lib/libart.so (_ZN3art22IndirectReferenceTable17AbortIfNoCheckJNIERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE+134)2022-04-11 14:16:22.523 3756-3756/? A/DEBUG: #08 pc 0023ecaf /system/lib/libart.so (_ZNK3art22IndirectReferenceTable10GetCheckedEPv+250)2022-04-11 14:16:22.525 3756-3756/? A/DEBUG: #09 pc 0023c05b /system/lib/libart.so (_ZN3art9JavaVMExt16DecodeWeakGlobalEPNS_6ThreadEPv+30)2022-04-11 14:16:22.526 3756-3756/? A/DEBUG: #10 pc 00337679 /system/lib/libart.so (_ZNK3art6Thread13DecodeJObjectEP8_jobject+164)2022-04-11 14:16:22.528 3756-3756/? A/DEBUG: #11 pc 00265843 /system/lib/libart.so (_ZN3art3JNI11NewLocalRefEP7_JNIEnvP8_jobject+406)2022-04-11 14:16:22.530 3756-3756/? A/DEBUG: #12 pc 0060eff9 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (getLoggingService+88)2022-04-11 14:16:22.531 3756-3756/? A/DEBUG: #13 pc 0061a977 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so2022-04-11 14:16:22.533 3756-3756/? A/DEBUG: #14 pc 005ef911 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so2022-04-11 14:16:22.535 3756-3756/? A/DEBUG: #15 pc 00025437 /data/app/com.guodong.android.linphone-1/lib/arm/libbctoolbox.so (bctbx_logv+182)2022-04-11 14:16:22.536 3756-3756/? A/DEBUG: #16 pc 006f5061 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so2022-04-11 14:16:22.538 3756-3756/? A/DEBUG: #17 pc 006f51d9 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (wake_lock_acquire+152)2022-04-11 14:16:22.539 3756-3756/? A/DEBUG: #18 pc 006601c5 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so2022-04-11 14:16:22.541 3756-3756/? A/DEBUG: #19 pc 00660b27 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (belle_sip_client_transaction_init+138)2022-04-11 14:16:22.542 3756-3756/? A/DEBUG: #20 pc 006fb1d3 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (belle_sip_nict_new+30)2022-04-11 14:16:22.544 3756-3756/? A/DEBUG: #21 pc 0065c3a7 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (belle_sip_provider_create_client_transaction+46)2022-04-11 14:16:22.546 3756-3756/? A/DEBUG: #22 pc 0065dec3 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so2022-04-11 14:16:22.547 3756-3756/? A/DEBUG: #23 pc 0065daf7 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (belle_sip_refresher_refresh+28)2022-04-11 14:16:22.549 3756-3756/? A/DEBUG: #24 pc 005fac23 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (linphone_proxy_config_refresh_register+34)2022-04-11 14:16:22.550 3756-3756/? A/DEBUG: #25 pc 005e9fc5 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (linphone_core_refresh_registers+40)2022-04-11 14:16:22.552 3756-3756/? A/DEBUG: #26 pc 019fc3bf /data/app/com.guodong.android.linphone-1/oat/arm/base.odex (offset 0x18de000)2022-04-11 14:16:23.096 227-255/? I/AudioFlinger: BUFFER TIMEOUT: remove(4099) from active list on thread 0xabd03e00剖析问题2通过解体日志第27行2022-04-11 14:16:22.530 3756-3756/? A/DEBUG: #12 pc 0060eff9 /data/app/com.guodong.android.linphone-1/lib/arm/liblinphone.so (getLoggingService+88)能够判断解体是在getLoggingService()这个办法里 ...

May 10, 2022 · 5 min · jiezi

关于android:运动健康者的福音拍照即可获取食物卡路里和营养元素啦

现在,身材治理已成为人们日常生活中重点关注的内容,除了静止之外,热量的摄入也是重中之重,想要维持现实的身体健康和体重状态,人们须要长期测量本人每日摄入食物的体量、热量和营养价值,这须要实践者有极强的急躁、执行力和常识储备,从而成为了一部分身材治理路线上的拦路虎。 因而很多静止衰弱类App中反对食物辨认,能够实现拍照辨认食物卡路里和营养元素的性能,满足人们日常生活中疾速获取食物信息、及时治理热量摄入的需要,为人们身材治理提供极大的便捷。 技术原理那么,这样一种拍照获取食物热量和养分信息的性能背地的技术原理是什么呢?其实靠的就是图片分类能力。 图片分类能力是AI人工智能畛域重要的根底性能,理论利用场景宽泛, 传统的图片分类办法流程包含预处理、特征提取、分类器,其中特征提取须要研究者投入大量精力手工设计提取,且只实用于简略的图像分类,对于理论状况简单的图片内容则无奈辨认。 近年来,基于深度学习的图片分类能力开始风行,应用特定的推理框架,通过神经网络核心技术,对图片中的实体对象进行分类并增加标注信息,帮忙定义图片题材和实用场景等。 大抵的图片分类流程为,开发者传入照片应用动态图片检测,或者调起摄像头应用视频流检测,图片分类能力会依据开发者应用的端侧/云侧算法模型进行剖析,返回给App图片的类别(如:动物、家具、手机)及置信度。 HMS Core机器学习服务图片分类能力的性能劣势华为HMS Core的机器学习服务图片分类性能基于深度学习的办法,能够辨认图片中物体、场景、行为等信息,返回对应标签信息。机器学习服务图片分类能力在辨认准确率和速度性能方面都有所晋升。 迁徙学习法:加强图片标签模型和常识迁徙能力,并对深度神经网络拓扑构造一直调优,准确率晋升38%; 集成WordNet语义网络:优化语义分析模型,对图片内容进行语义剖析,实现概念标签主动推理,反对标签量2.3万; 基于华为GPU云服务减速:显存带宽较上代GPU晋升2倍,位宽晋升8倍,辨认单张图片仅100毫秒。 开发者能够应用图片分类能力现有的类别,也能够自定义图片分类模型,对各种食物图片进行收集和训练,而后导入对应的标签数据,造成宏大的食物热量数据库。最初,通过华为相机的景深摄像头性能,无效测量手机与物体之间的间隔,大抵辨认出该物体的大小和分量,再与数据库中的信息相匹配,从而实现食物不同类别、不同大小的卡路里的计算。 除此之外,机器学习服务图片分类能力还广泛应用于图片分类管理场景,比方利用于手机相册分类管理、电商App的商品图智能分类等场景,为各类利用开发者提供良好的解决方案。 点击查看图片辨认分类信息列表。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 10, 2022 · 1 min · jiezi

关于android:AndroidTextView跑马灯探秘

前言自定义View实现的跑马灯始终没有实现相似 Android TextView 的跑马灯首尾相接的成果,所以始终想看看Android TextView 的跑马灯是如何实现 本文次要探秘 Android TextView 的跑马灯实现原理及实现自下往上成果的跑马灯 探秘TextView#onDraw原生 Android TextView 如何设置开启跑马灯成果,此处不再形容 View 的绘制都在 onDraw 办法中,这里间接查看 TextView#onDraw() 办法,删减一些不关怀的代码 protected void onDraw(Canvas canvas) { // 是否须要重新启动跑马灯 restartMarqueeIfNeeded(); // Draw the background for this view super.onDraw(canvas); // 删减不关怀的代码 // 创立`mLayout`对象, 此处为`StaticLayout` if (mLayout == null) { assumeLayout(); } Layout layout = mLayout; canvas.save(); // 删减不关怀的代码 final int layoutDirection = getLayoutDirection(); final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection); // 判断跑马灯设置项是否正确 if (isMarqueeFadeEnabled()) { if (!mSingleLine && getLineCount() == 1 && canMarquee() && (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) != Gravity.LEFT) { final int width = mRight - mLeft; final int padding = getCompoundPaddingLeft() + getCompoundPaddingRight(); final float dx = mLayout.getLineRight(0) - (width - padding); canvas.translate(layout.getParagraphDirection(0) * dx, 0.0f); } // 判断跑马灯是否启动 if (mMarquee != null && mMarquee.isRunning()) { final float dx = -mMarquee.getScroll(); // 挪动画布 canvas.translate(layout.getParagraphDirection(0) * dx, 0.0f); } } final int cursorOffsetVertical = voffsetCursor - voffsetText; Path highlight = getUpdatedHighlightPath(); if (mEditor != null) { mEditor.onDraw(canvas, layout, highlight, mHighlightPaint, cursorOffsetVertical); } else { // 绘制文本 layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } // 判断是否能够绘制尾部文本 if (mMarquee != null && mMarquee.shouldDrawGhost()) { final float dx = mMarquee.getGhostOffset(); // 挪动画布 canvas.translate(layout.getParagraphDirection(0) * dx, 0.0f); // 绘制尾部文本 layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } canvas.restore();}Marquee依据 onDraw() 办法剖析,跑马灯成果的实现次要依赖 mMarquee 这个对象来实现,好的,看下 Marquee 吧,Marquee 代码较少,就贴上全副源码吧 ...

May 10, 2022 · 9 min · jiezi

关于android:Gradle连载5多个构建工程以及android工程配置

一、罕用的源集属性apply plugin:'java'sourceSets { main { // 对main SourceSet进行配置 }}task custom65SourceSetTask { sourceSets.all { println "name:" + name println "outputs.getFiles():" + outputs.getFiles() println "outputs.class:" + outputs.class println "outputs:" + outputs println "java:" + java println "java.getClass():" + java.getClass() println "resources:" + resources println "getResources():" + getResources() println "==================================" }}这面是SourceSet汇合中罕用的属性打印 二、插件增加的工作 三、多个构建工程include ':app'project(":app").projectDir = new File(rootDir, 'chapter2/app')include ':base'project(":base").projectDir = new File(rootDir, "chapter2/base")// 上面就是目录构造// -- chapter2// -- --app// -- -- --build.gradle// -- -- --src// -- --base// -- -- -- base.iml// -- -- -- builde.gradle// -- -- -- src配置好了构建文件,那么就去看一下具体的文件文件地址;app/build.gradle ...

May 10, 2022 · 2 min · jiezi

关于android:日调用量超600亿次HMS-Core-HiAI-Foundation助力AI应用高效开发

随着新技术的一直演进,人工智能曾经宽泛地利用到教育、金融、物流、批发、交通、医疗等各个领域。而在AI高速倒退的当下,高效开发变得更为重要,如何将创意想法与AI技术深度交融,迅速转化为可落地的AI利用,是开发者在强烈竞争中制胜的要害。 为了助力开发者疾速上线AI业务,为消费者提供翻新AI体验,HMS Core HiAI Foundation将HiAI 生态中的底层硬件能力凋谢,为开发者提供了300多个具备业界优质模型兼容性的AI算子,让开发者更简略快捷地利用华为AI能力,疾速构建智能AI利用。 此外,HUAWEI HiAI Foundation还推出端云协同、Model Zoo、自主调优工具包、多IP深度协同等多种解决方案和能力,为泛滥业务场景打造更高性能更低功耗的计算环境,助力开发者疾速开发和部署AI利用。 五大性能劣势,助力开发者高效灵便开发• 端云协同:针对新业务场景算子以及已有典型业务场景算子,提供性能优化、疾速降级平台能力的解决方案 以后,AI业务和算法模型都在继续疾速演进,AI计算平台适配新业务和新算法疾速降级成为难题。端云协同具备可变的计算框架、广适的模型构造,助力开发者疾速反对新模型、上线新业务,让消费者疾速取得端侧AI带来的体验晋升。 • Model Zoo:辅助开发者优化模型构造,更好地利用NPU减速劣势 开发者在业务开发过程中,为了更大程度利用底层算力,须要针对底层硬件构造做一些模型调整,这个过程可能会呈现效率低,资源利用有余的状况。HiAI Foundation打造Model Zoo,将NPU敌对的模型构造、Backbone、算子放进去,供开发者自行筛选,辅助其优化模型构造,更好地施展麒麟芯片NPU的减速劣势。 • 模型量化工具包:让开发者的App更快、更小 失常状况下,开发者训练的模型是32bit,这样的模型计算精度诚然高,但对手机功耗和内存的要求也比拟高。HiAI Foundation为开发者提供模型量化工具包,在满足计算精度的前提下,能够把原始模型间接量化为更小、更轻便且更适宜NPU构造的低比特模型,无需开发者做二次调整,从而节俭手机空间,升高计算资源的耗费。 HiAI Foundation模型量化工具包 • 网络结构搜寻工具包:让网络设计更简略、更无效 网络结构搜寻工具包反对多种类型的网络结构搜寻工作,蕴含分类,检测和宰割。通过精度,性能指标牵引,协同硬件信息通过最优化搜索算法取得最优的网络结构,失去最佳的性能晋升。网络结构搜寻工具包反对多种支流训练框架使能,蕴含:caffe,tensorflow,pytorch。同时针对多种支流硬件平台具备算力和时延建模的能力。 HiAI Foundation网络结构搜寻工具包 • 多IP深度协同:各计算单元共用DDR内存,晋升性能降低功耗 HiAI Foundation在硬件裸算力凋谢的同时,还具备硬件底层多IP深度协同的劣势。多IP深度协同的益处在于,CPU、NPU、ISP、GPU等各计算IP能够共用DDR内存,最大水平缩小IP之间拷贝数据流转的开销,既可晋升性能又能降低功耗。 从平台架构来看,HMS Core HiAI Foundation连接智慧业务和底层硬件能力,下层反对MNN、TNN、华为MindSpore Lite、Paddle Lite、KwaiNN等合作伙伴的框架对接,利用推理减速平台(Foundation DDK)和异构计算平台(Foundation HCL)将AI工作调入NPU/CPU/GPU/DSP等IP中进行计算,赋能手机、平板、智慧屏、车机、手表等终端设备,将更多好玩酷炫的AI利用带到消费者背后。 HiAI Foundation 凋谢架构 日调用量冲破600亿,引领端侧AI行业标准构筑现在,AI技术在端侧的利用越来越宽泛,语音辨认、图像识别、图像宰割、图像超分、人脸识别、文字辨认等曾经成为全民通用的技术,消费者期待更好玩的AI利用呈现,心愿取得更优质的AI利用体验。HiAI Foundation为AI利用开发提供了根底保障,让开发者可能突破性能瓶颈,进步开发效率,节俭计算资源,更好地投入到AI玩法的钻研与落地中,满足消费者对智慧生存的美妙期待。 据统计, HiAI Foundation自2018年凋谢以来,以高性能、低功耗、高易用性播种越来越多的开发者青眼,短短几年间日调用量从100万+增长到600亿+(数据来自参加体验改良打算的用户)。爱奇艺、美颜相机、抖音、剪映、快手、优酷等头部利用已先后接入HiAI Foundation,利用端侧AI弱小的计算能力,为用户打造智能新体验。 HiAI Foundation日调用量冲破600亿+ 为了助力端侧AI行业凋敝倒退,HiAI Foundation在优化平台性能的同时,已退出AI标准化组织AITISA(人工智能产业技术创新策略联盟),并参加端侧AI规范草案撰写,独特构筑AI行业标准,目前该草案已进入规范定稿审核阶段。 更多HiAI Foundation相干信息,请关注5月24日HUAWEI Developer Day(简称HDD)-HiAI Foundation主题演讲,你也能够登录华为开发者联盟官网>HMS Core>HiAI Foundation查看。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~ ...

May 9, 2022 · 1 min · jiezi

关于android:Guide-to-app-architecture-1-2022版翻译

如何构建高质量并稳如狗的APP?该指南蕴含了你想要的的最佳实际计划和官网举荐的架构。 注:该指南假设你曾经相熟Android Framework,如果是老手,请学习课程Android Basics course,你会学一些该指南中提到的概念和常识。挪动APP的用户体验一个典型的Android APP会用到以下组件:activity, fragment, service, content provider, broadcast receivers,大部分会在menifest文件中申明。Android OS应用该文件把利用和用户交互整合起来。一个设施上有多个app,一个app有多个组件,用户在玩手机,短时间内他会在几个app间来回切换,比方在音乐APP听歌,老板来电话了,就切换到电话APP接听,老板让发一份资料到邮箱,挂断当前就切换到邮件APP发邮件,关上文件治理APP选了须要的文件,把邮件发送进来后从新切换回音乐APP听音乐,这一系列操作背地都暗藏了不同类型的用户驱动的工作流程和工作。试想一下音乐APP是你开发的,如何设计来适配这些流程和工作? 挪动设施资源无限,零碎可能会在任何时刻杀掉某些APP过程来为新启动的过程腾出空间。 在这种条件下,你的APP组件可能是独自并随机无序的启动的,OS或用户可能随时关掉它。这种随机性事件是你无法控制的,所以不应该在组件中保留利用数据或状态,且组件间不应相互依赖。 常见的架构准则如果不应该应用组件来保留利用数据和状态,那应该怎么设计APP呢? 随着android利用的规模不断扩大,对利用就有肯定的要求了,可能不便的扩大,保障稳健性,保障易于测试,这些要求意味着须要一个好的架构。 APP架构会定义:1.应用程序中有几个part, 2.part的边界,3.part承当的职责。要满足这些需要,架构要遵循一些特定的准则。 Separation of concerns关注点拆散准则SOC对只与“特定概念、指标”(关注点)相关联的软件组成部分进行“标识、封装和操纵”的能力,即标识、封装和操纵关注点的能力。这是解决复杂性的一个准则,因为关注点混淆在一起会导致复杂性减少,所以要把不同的关注点拆散开来,别离解决。益处:“零碎中的一个局部产生了变动,不会影响其余局部。”“即便须要扭转,也可能清晰地辨认出那些局部须要扭转。”“如果须要扩大架构,将影响最小化,曾经能够工作的每个局部都将持续工作。”常见的谬误是把所有的代码都写在activity或者fragment中。这些基于 UI 的类应该只蕴含解决 UI 和操作系统交互的逻辑。精简这些类,能防止许多与组件生命周期相干的问题,并进步这些类的可测试性。 Activity和Fragment的实现是android零碎负责的,你并没有负责其实现,它们只是一个胶水类,用来粘合你写的APP和Android零碎,这种粘合性的体现就是APP和零碎之间的契约。零碎在某些情况下会杀掉APP。例如用户交互时被动关掉APP,或者设施电量有余时零碎杀掉APP。为了提供令人满意的用户体验和更易于治理的应用程序保护体验,最好尽量减少对它们的依赖。 Drive UI from data models(数据模型驱动UI)另一个重要准则是用数据模型驱动UI,最好是长久化模型。数据模型决定了展示在APP上的数据。数据模型独立于APP的UI元素和其余组件,这也意味着数据模型和UI&组件的生命周期无关。然而当OS从内存中删除利用过程的时候,它们依然会隐没。 应用长久化模型会很爽,起因如下: 当Android零碎杀掉APP的时候,用数据不会失落。当网络连接很弱,或者不可用的时候,APP能够持续运行。如果App架构基于数据模型,App就会更强壮,更加不便测试。 举荐的利用架构本节演示如何依照举荐的最佳实际来构建你的利用。 留神:这里的倡议和最佳实际可宽泛的利用于APP架构,不便扩大、进步APP品质和稳健性,并使之易于测试。然而,这只是一个指南,要依据须要进行调整以适应您的要求。依据下面提到的架构准则,每个应用程序至多要有两层: UI层:把数据展示在屏幕上数据层:解决业务逻辑;提供数据能够另外的层,如domain层,用来简化和重用UI层和DATA层之间的交互。 注:图中的箭头示意类之间的依赖。domain layer依赖 data layer。UI Layer该层的职责是展现利用数据到屏幕上。当数据发生变化时,要把这些变动展示在屏幕上。数据变动来自用户交互(如点击按钮)或者内部输出(如network response)。 UI层由两局部组成: UI elements: 把数据渲染到屏幕上,应用各种View或者Jetpack Compose来构建elements.State holders: 例如ViewModel类,用来持有数据并把数据提供给UI,并且负责逻辑解决。于是上图扩大为: Data Layer该层蕴含业务逻辑,业务逻辑由一系列规定组成,决定了APP如何创立,存储并更改数据,这会赋予APP价值。该层由repositories组成,每一个repository都蕴含0到多个数据源。对每个不同的数据类型都要创立一个repository类。例如,对于movie相干的数据要创立一个MoviesRepository类,对于payments相干的数据要创立一个PaymentsRepository。Repository类次要负责下列工作: 为利用的其余局部提供数据集中处理数据更新协调多数据源从利用的其余局部冲向数据源解决业务逻辑每个数据源类只负责解决一个数据源,能够是文件数据源,网络数据源,本地DB数据源。数据源类是application和system之间操作数据的桥梁。 Domain Layer该层是可选的,位于UI Layer 和 Data Layer之间。用于封装简单的业务逻辑或者简略的被多个ViewModel复用的简略业务逻辑。因为并不是所有的APP都有这些需要,所以它是可选的。在须要的时候才用到,例如解决复杂性和可复用性。 这一层的类通常称为use cases / interactors. 每个use case负责一个繁多的性能。例如有好几个ViewModel都要依赖时区信息在屏幕上展现信息,那么就能够设计一个GetTimeZoneCase类来专门负责。 解决各组件之间的依赖APP中的类须要其余类能力正确的运行。能够应用上面任意一种设计模式来收集相干类的依赖: DI:依赖注入容许类在不结构它们的状况下定义它们的依赖关系。在运行时,由另一个类负责这些依赖项。Service Locator: 服务定位器模式为类提供了一个注册表,能够在其中获取类的依赖而不是结构它们。这些模式容许你不便的扩大代码,因为它们提供了清晰的模式用于治理类之间的依赖,去掉了反复代码,防止掉了复杂性。另外这些模式还有助于在测试和生产环境中疾速切换。 ...

May 8, 2022 · 1 min · jiezi

关于android:Android-13-将限制应用侧载权限从而提高用户隐私安全

继去年苹果公司 CEO 库克在 DealBook 峰会上示意“如果想要侧载 APP,请去购买安卓手机”后,近日,有音讯称从 Android 13 开始,Google 将不容许侧载 APP 应用Accessibility API。 所谓“软件侧载”,指的是用户绕开官网的软件商店,自行在手机零碎中装置第三方机构开发的应用软件。 始终以来,安卓零碎的最大特色就是容许用户自行侧载各种利用,此次对于Accessibility API 的限度也并不是想要齐全禁止侧载,而是避免该接口的滥用所导致的歹意行为,从而进步侧载利用的安全性。  Accessibility API 是一套十分弱小的工具,若被滥用,其可让应用程序齐全管制用户的设施。因而,谷歌多年来始终在打击对该接口的滥用和歹意应用行为。 近期,谷歌官网 Play 利用商店就在订正后的政策中,阻止了所有第三方利用通过该 API 进行近程录音。 值得注意的是,此限度并不会影响通过谷歌官网 Play 商店和可信的第三方利用商店下载 / 侧载的 App,仅针对不可信起源的 APK 安装包。 最初,谷歌示意,Android 13 零碎对于不可信渠道的利用,会全面禁止用户向该利用授予权限,相应的局部权限会显示为灰色,点击赋予权限则会弹出“为了您的平安,以后此设置暂不可用”的提醒音讯。

May 7, 2022 · 1 min · jiezi

关于android:HMS-Core地理围栏能力助你实现指定范围人群的精准消息推送

精准推送是挪动端产品留存阶段的次要经营伎俩,精准推送经常会与用户画像紧密结合,针对用户的爱好、画像,采纳不同策略,但基于用户所属区域推送音讯却很难实现。目前市面上大多数第三方音讯推送服务商,在零碎未深度定制的状况下,通常不反对将推送人群范畴准确到某个商圈或较小的区域,而天文围栏技术能够很好地补救这一点。天文围栏就是用一个虚构的栅栏围出一个虚构天文边界,当手机进入、来到或在这个围起来的特定天文区域内流动时,手机能够主动接管告诉和正告音讯。将天文围栏和音讯推送相结合,即可实现对特定区域人群的精准音讯推送。 举个例子,一款游览出行类App想在江苏推广其门票业务,他能够针对南京、苏州等城市的热门旅游景点划定天文围栏,当指标受众在特定时间段达到某个旅游景点左近时,将会收到一条特定音讯推送“XX景点门票优惠券已放入账户中,立刻支付>>”在用户有购买XX景点门票需要时应景推送优惠信息,让用户无奈回绝。 实现办法 用华为定位服务天文围栏能力联合推送服务音讯推送能力,就可实现对指定范畴人群的精准音讯推送。通过设置特定的区域,能够检测用户的事件状态,例如他们何时进入、来到或停留在该区域,一旦满足触发条件,用户设施将实时收到音讯推送。即便利用不在后盾运行,也能够在用户设施上传递和显示音讯,消息传递率可达99%。 成果展现: 在测试设施上装置演示利用。启动演示应用程序,点击天文围栏屏幕上的增加天文围栏,而后设置相干参数以创立天文围栏。期待天文围栏被触发。在触发天文围栏时查看收到的音讯。 开发步骤 配置SDK的Maven仓地址。(Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。这里以7.1版本为例)a) 在“buildscript > dependencies”中减少agcp插件配置。 buildscript {i. dependencies {ii. ...iii. // 减少agcp插件配置,举荐您应用最新版本的agcp插件。iv. classpath 'com.huawei.agconnect:agcp:1.6.0.300' }v. }b) 我的项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址。 pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() // 配置HMS Core SDK的Maven仓地址。 maven { url 'https://developer.huawei.com/repo/' } }}dependencyResolutionManagement { ... repositories { google() mavenCentral() // 配置HMS Core SDK的Maven仓地址。 maven { url 'https://developer.huawei.com/repo/' } }}2.在“dependencies ”中增加如下编译依赖。 //利用级的“build.gradle”文件dependencies { implementation 'com.huawei.hms:location: 6.4.0.300' implementation 'com.huawei.hms:push: 6.3.0.304'}在 AndroidManifest.xml 文件中申明零碎权限。因华为定位服务采纳GNSS、Wi-Fi、基站等多种混合定位模式进行定位,赋予您的应用程序疾速、精准地获取用户地位信息的能力,须要用到网络,准确的地位权限,粗略的地位权限如果您须要应用程序在后盾执行时也具备继续定位能力,须要在Manifest文件中申请ACCESS_BACKGROUND_LOCATION权限: ...

May 7, 2022 · 2 min · jiezi

关于android:华为音频编辑服务实时变声大叔音怪兽音随意变换

变声是直播类、聊天类利用中用户常常应用的性能。例如:很多主播抉择应用变声器来实现带动直播间氛围;和敌人语音聊天时抉择变成萝莉音让聊天更乏味。HMS Core音频编辑服务提供变声能力,帮忙开发者在利用中构建变声性能。用户能够通过预置的变声格调进行变声,晋升音频可玩性的同时无效爱护用户隐衷,让你得心应手、想变就变。 HMS Core音频编辑服务目前可提供7种变声成果,包含大叔、萝莉、男生、女声、怪兽、卡通、机器人。不限语种,且实时处理,可简略便捷的利用在音视频通信或互娱直播场景,为主播提供实时变声特效,让直播音色更难听、更乏味。 变声成果 上面咱们就一起来实操一下如何接入华为音频编辑服务,实现变声成果吧。 1开发筹备具体筹备步骤可参考华为开发者联盟官网 2编辑工程集成2.1设置利用的鉴权信息开发者须要通过api_key或者Access Token来设置利用鉴权信息。 通过setAccessToken办法设置Access Token,在利用启动时初始化设置 HAEApplication.getInstance().setAccessToken("your access token");通过setApiKey办法设置api_key,在利用启动时初始化设置一次即可,无需屡次设置。 HAEApplication.getInstance().setApiKey("your ApiKey");2.2文件接口调用文件接口实现具体性能,必要条件:创立文件接口回调。 private ChangeSoundCallback callBack = new ChangeSoundCallback() { @Override public void onSuccess(String outAudioPath) { // 解决胜利 } @Override public void onProgress(int progress) { // 进度回调解决 } @Override public void onFail(int errorCode) { // 解决失败 } @Override public void onCancel() { // 勾销解决 }};2.3实现变声性能调用applyAudioFile接口进行变声。 // 变声HAEChangeVoiceFile haeChangeVoiceFile = new HAEChangeVoiceFile();ChangeVoiceOption changeVoiceOption = new ChangeVoiceOption();changeVoiceOption.setSpeakerSex(ChangeVoiceOption.SpeakerSex.MALE);changeVoiceOption.setVoiceType(ChangeVoiceOption.VoiceType.CUTE);haeChangeVoiceFile.changeVoiceOption(changeVoiceOption);// 调用接口haeChangeVoiceFile.applyAudioFile(inAudioPath, outAudioDir, outAudioName, callBack);// 勾销变声工作haeChangeVoiceFile.cancel();除了变声,华为音频编辑服务还为开发者提供了一站式音频编辑服务,涵盖了音频/音乐解决所需的几十项业余能力,开发者只须要通过简略的集成形式即可让利用获取弱小的音频解决能力,可极大帮忙客户晋升音频/音乐方面的解决效率。 ...

May 6, 2022 · 1 min · jiezi

关于android:推送数据分析全新升级优化方向一目了然

日常经营过程中,Push是经营人员触达用户的罕用伎俩,无论是新性能的告诉,还是流动的揭示下发,都能够通过Push告知用户。 做好Push将无效晋升相干业务指标,如用户留存,用户沉闷等,同样,做好个性化Push,对于晋升用户粘性以及用户转化等指标也是具备显著正向成果。 围绕着如何优化Push成果,HMS Core剖析服务智能经营平台推出新版本推送数据报告,从根本上洞察影响推送成果的起因,帮忙开发者找到晋升推送成果的要害。 *Push折损起因详情(数据为模仿) 1、通过对Push发送节点的拆解,开发者能够看到具体折损数据,针对各个环节进行优化调整,晋升Push有效性。 例如针对用户已敞开告诉的景象,开发者能够在App内揭示用户开启告诉: 1)、App降级后,用户关上App,跳出弹窗揭示用户关上音讯揭示; 2)、通过某些个性化性能,进步用户关上推送的志愿。比方:关注某个作者揭示他关上开关以接管作者最新文章;买完商品后揭示关上开关以跟踪物流停顿等; 3)、通过某些有利于用户的音讯,揭示用户关上。比方:财经类App关上开关以接管最新股市行情;电商类App关上开关以接管优惠信息等; 4)、通过流动激发用户趣味,疏导用户关上开关,如:关上音讯告诉,赠送积分、优惠券等。 *艾达法令示意 2、开发者通过推送数据报告能够判断各个节点散失人数的多少,针对点击率较低的状况,能够通过优化Push文案内容以及发送工夫点等形式晋升用户转化,针对转化率较低的状况,能够通过加大流动优惠力度等形式晋升用户转化。 1)、开发者能够通过A/B测试得出对于用户较有吸引力的文案类型,唤起用户点击欲望; 2)、开发者通过对指标发送人群进行深刻洞察,依据人群偏好,提供相干福利优惠,吸引用户点击,进步转化。 经营流动往往须要通过一点一滴的优化积攒能力获得较好的问题。心愿通过HMS Core剖析服务智能经营平台的推送数据报告降级,开发者可能在更加理解推送各个环节散失详情的根底上晋升流动成果。 智能经营服务官网介绍 智能经营服务操作指南 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 5, 2022 · 1 min · jiezi

关于android:HMS-Core分析服务助您掌握用户分层密码实现整体收益提升

随着市场愈发成熟,开发者从均衡收益和危险的角度开始逐渐摸索混合变现的劣势,内购+广告就是目前市场上混合变现的次要形式之一。 对于混合变现模式,您是否有这样的困惑: 如何判断哪些用户更违心看广告、哪些用户付费志愿更高,更好地均衡内购和广告? 在晋升整体支出的根底上,怎么为用户提供更好的产品体验? HMS Core剖析服务下的预测服务个性,可能实时预估用户付费概率,实现精准分层,帮忙您动静调整经营策略,晋升「内购+广告」整体支出! 如何实现?① 按付费志愿进行用户分群基于华为剖析服务上报的用户事件,预测服务联合机器学习技术,实现高/中/低概率付费人群的精准预测。 ② 获取预测受众至APP通过预测服务提供的预测受众导出能力,将预测后果实时返回至APP。 ③ 优化经营策略基于付费志愿强弱的分层后果,向用户举荐合乎其生产习惯的广告或内购我的项目。 解决方案:预测用户付费志愿,差异化举荐游戏资源休闲类游戏个别更偏向于广告变现,但过多无差别的广告推送会影响玩家体验,甚至造成散失。开发者能够通过付费预测模型预估每个用户的付费概率,将用户分为高付费志愿/低付费志愿两局部,对低付费志愿用户减少广告场景和频次,疏导其观看激励视频获取特定道具;对高付费志愿用户举荐合乎其生产习惯的现金礼包,最终实现支出和用户留存双增长。 *闯关失败界面示意图(虚构设计) HMS Core剖析服务的预测服务能更精确地洞察用户需要,实现精准分层,帮忙开发者兼顾收益和用户体验,助力APP疾速成长。 点击进入预测服务官网, 理解更多精细化经营计划。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 5, 2022 · 1 min · jiezi

关于android:SmartDialog迁移至40一份真诚的迁移说明

前言一个开源库,随着一直的迭代优化,难免会遇到一个很苦楚的问题 最后的设计并不是很正当:想增加的很多新性能都受此掣肘想使得该库更加的弱小和强壮,必须要做一个重构 因为重构波及到对外裸露的api,所以大家会遇到一个比拟焦躁的问题:更新版本后,会大面积报错我思考了很久,到底怎么帮大家疾速迁徙呢?最终想到了一个还算正当的计划对于flutter_smart_dialog 4.0版本的改变,很多是为了解决本人以前考虑不周的历史遗留,以前这个库的初心,次要是为了解决loading和dialog穿透问题;当初扩大到:custom dialog,attach dialog,loading,toast,最后的设计真的力不从心了,config中的api难以去细分的管制这四个模块性能,一些参数的设计基于当初的性能和场景也不太正当等等 心愿大家可能了解我为什么要重构,我相对不是在搞事件 疾速迁徙指南兼容API(必须)⭐️阐明show办法疾速兼容SmartDialog.compatible.show();SmartDialog.compatible.showAttach();SmartDialog.compatible.showLoading();SmartDialog.compatible.showToast();config疾速兼容SmartDialog.compatible.config;减少compatible两头变量,可疾速兼容改变的各种参数 疾速操作应用全局替换性能疾速迁徙:SmartDialog.show ---> SmartDialog.compatible.show Mac:command + shift + rWindows:ctrl + shift + r Config:SmartDialog.config ---> SmartDialog.compatible.config Mac:command + shift + rWindows:ctrl + shift + r 参数移除(必须)⭐️4.0版本删除了大量参数办法阐明showLoading(...)删除background参数(compatible不兼容该参数)showToast(...)删除alignment参数(compatible不兼容该参数)showAttach(...)删除highlight参数(compatible兼容该参数)删除了这些参数,初始化自定义loading和toast的时候,须要做一点点调整void main() => runApp(MyApp());class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: HomePage, // here navigatorObservers: [FlutterSmartDialog.observer], // here builder: FlutterSmartDialog.init( //default toast widget toastBuilder: (String msg) => CustomToastWidget(msg: msg), //default loading widget loadingBuilder: (String msg) => CustomLoadingWidget(msg: msg), ), ); }}阐明background和alignment这俩个参数切实没什么用,用到的频率切实太低了 ...

May 4, 2022 · 3 min · jiezi

关于android:Stack-Overflow-上最热门的-10-个-Kotlin-问题

这是 Stack Overflow 上最热门的几个 Kotlin 问题,每个问题如果更深刻的剖析,都能够独自写一篇文章,前面我会针对这些问题,在进一步的剖析。 通过这篇文章你将学习到以下内容: Array<Int> 和 IntArray 的区别,以及如何抉择Iterable 和 Sequence 的区别,以及如何抉择罕用的 8 种 For 循环遍历的办法在 Kotlin 中如何应用 SAM 转换如何申明一个动态成员,Java 和 Koltin 进行互操作为什么 kotlin 中的智能转换不能用于可变属性,如何能力解决这个问题当重写 Java 函数时,如何决定参数的可空性如何在一个文件中应用多个具备雷同名称的扩大函数和类译文Array 和 IntArray 的区别Array Array<T> 能够为任何 T 类型存储固定数量的元素。它和 Int 类型参数一起应用, 例如 Array<Int>,编译成 Java 代码,会生成 Integer[] 实例。咱们能够通过 arrayOf 办法创立数组。 val arrayOfInts: Array<Int> = arrayOf(1, 2, 3, 4, 5)IntArray IntArray 能够让咱们应用根底数据类型的数组,编译成 Java 代码,会生成 int[] (其它的根底类型的数组还有 ByteArray , CharArray 等等), 咱们能够通过 intArrayOf 工厂办法创立数组。 val intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)什么时候应用 Array<Int> 或者 IntArray ...

April 29, 2022 · 4 min · jiezi

关于android:全场景AI推理引擎MindSpore-Lite-助力HMS-Core视频编辑服务打造更智能的剪辑体验

挪动互联网的倒退给人们的社交和娱乐形式带来了很大的扭转,以vlog、短视频等为代表的新兴文化样态正受到越来越多人的青眼。同时,随着AI智能、美颜修图等性能在图像视频编辑App中的利用,促使视频编辑效率和视频成果失去了很大的晋升,也让视频利用场景更加丰盛。 以后剪辑产品性能多样、素材丰盛,然而开发周期较长、门槛较高。为了让剪辑软件更加智能、简略易用,晋升开发者的效率,HMS Core 6为开发者提供视频编辑服务(Video Editor Kit),提供视频导入、编辑、渲染、导出、媒资治理等一站式视频解决能力。除了反对残缺的传统视频编辑性能,视频编辑服务还提供了诸如专属滤镜、人物追踪、一键染发等丰盛的AI解决能力辅助视频创作,为用户带来更加畅快的创作灵感,打造更加智能的剪辑体验。 多样化的智能视频解决能力是由一个个神经网络模型实现的,因为训练好的模型文件较大(单个模型大小个别为十几甚至几十兆),而手机等设施ROM和RAM空间大小无限,如何以更少的终端设备空间占用为开发者提供更丰盛的智能化视频解决能力,成为挪动利用视频编辑面临的一大挑战。 为解决以上挑战,HMS Core视频编辑服务抉择应用华为自研AI框架MindSpore Lite进行神经网络模型推理。MindSpore Lite是一款全场景AI推理引擎,通过对立API接口反对在端、边、云的不同环境疾速部署,反对HarmonyOS、Android、iOS、Windows等多种操作系统,反对Ascend、GPU、CPU(x86、arm……)等多种硬件执行。除反对MindSpore训练出的模型格局,MindSpore Lite还反对TensorFlow,TensorFlow Lite、Caffe、ONNX等第三方模型格局的转换及推理。 MindSpore Lite为AI模型推理提供高性能和超轻量的解决方案:通过高效的内核算法和汇编级优化,以及CPU、GPU、NPU的异构调度,能够充分发挥硬件算力,实现最小化推理时延和功耗;提供模型量化压缩技术,采纳训练后量化(Post-Training Quantization, PTQ),无需数据集即可间接将权重数据从浮点型映射到低比特的定点数据,无效升高模型大小,助力AI模型在资源受限环境下的部署执行。 针对权重数据的量化反对固定比特量化和混合比特量化两种模式。固定比特量化采纳Bit-Packing的形式,反对1-16任意比特的权重量化,满足用户在不同压缩场景下的要求,同时针对模型量化后的数据分布状况,主动抉择适合的编码策略进行压缩编码,从而达到最优的压缩成果。 混合比特量化依据神经网络不同层对量化损失的敏感度不同的特点,采纳均方误差作为优化指标,主动搜寻出最适宜以后层的比特位,在保障精度的同时实现更大的压缩率。同时针对量化后的模型,采纳无限状态熵(Finite State Entropy, FSE)对量化后的权重数据进行熵编码进一步压缩,实现对模型的高效压缩,晋升模型传输速率和缩小模型存储空间。 除此之外,量化时还会采纳Bias Correction的形式,最小化其量化误差。Bias Correction会依据权重数据固有的统计学个性,反量化时对其进行校准,使权重值量化前后具备雷同的冀望和方差,可能大幅度提高模型精度。视频编辑服务中的AI模型采纳MindSpore Lite提供的混合比特量化形式,最终在保障精度的同时达到了均匀5x+的模型压缩成果,例如一键染发的模型从原来的20.86M压缩到3.76M,无效解决了模型过多、文件过大导致的部署艰难问题。 通过对AI模型的量化压缩,在ROM空间占用不变的前提下,保障剪辑产品能够部署更多的AI模型,充分发挥AI能力来提供更多的特效利用场景,使得剪辑性能更加弱小、更加智能。华为官网剪辑软件花瓣剪辑在接入视频编辑服务能力后,用户可通过应用专属滤镜、人物追踪等AI视频剪辑性能(局部个性随花瓣剪辑App降级陆续凋谢),让视频剪辑更便捷和更富裕趣味性。 MindSpore Lite致力于打造高性能、超轻量级的全场景 AI引擎,除高性能内核算法及硬件异构调度、量化压缩之外,还提供端云协同的一站式训练和推理能力。HMS Core视频编辑服务基于MindSpore Lite,助力开发者打造更加易用且智能的剪辑工具。 欲了解更多信息,欢送拜访官网 华为开发者联盟HMS Core官网 MindSpore官网 MindSpore开源社区

April 29, 2022 · 1 min · jiezi

关于android:开发者问第一期问答分享来啦

开发者问第一期问答分享,本期内容有AR Engine人脸表情demo、华为剖析实时渠道数据分析、Push跳转页面问题。 今后HMS Core将继续为大家分享开发者问答内容。 可点击链接,理解详情 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

April 29, 2022 · 1 min · jiezi

关于android:BlockCanary源码解析

BlockCanary源码解析在解说BlockCanary源码之前,咱们还是须要将一些前置的知识点。本文不讲Handler的原理了,不太懂的同学本人去百度看一下吧。 什么是卡顿在解说卡顿问题之前,咱们须要讲一下帧率这个概念。帧率是以帧称为单位的位图图像间断呈现在显示器上的频率。我将一个例子,电影播放。电影其实就是很多张照片(帧)的一个汇合,那为什么看起来是一个间断的过程呢?因为电影每一秒呈现过的图片不止一张。实际上电影个别一秒呈现的图片张数会在20-30张。假如电影一秒呈现了24张图片,那么这个电影的帧率就是24。帧率就是一秒中,呈现了多少帧。 晓得了什么是帧率,那么问题来了,为什么会呈现卡顿呢?卡顿在咱们的视觉下面的体现就是本来是晦涩的动画画面,当初变的不晦涩了。咱们下面讲过,动画其实是由很多图片形成。如果在一个24帧的电影中,忽然有一秒钟,在这一秒钟呈现了掉帧。也就是本来0...23的图片变成了 0...10...12...23.两头的某一帧没有渲染进去,那么这个在咱们视觉上就会呈现不晦涩的景象。也就是卡顿的景象。下面就是电影上呈现卡顿的景象。那么在咱们android零碎上呢? Android渲染机制在高刷手机没有呈现之前,咱们手机屏幕的帧率是60。就是意味着1秒钟会有60个画面呈现。那么也就是16ms就要有一个画面渲染。**Android零碎每隔16ms收回VSYNC信号,触发对UI进行渲染, 如果每次渲染都胜利,这样就可能达到晦涩的画面所须要的60帧,为了可能实现60fps,这意味着程序的大多数操作都必须在16ms内实现。如果超过了16ms那么可能就呈现丢帧的状况。**如果掉帧的频率很高,也就是导致卡顿的状况。 BlockCanary源码解析那么在android中,BlockCanary是怎么帮忙咱们去做卡顿检测的呢。明天咱们就来解说一下BlockCanary检测卡顿的原理。 个别咱们都通过以下的代码形式去开启咱们的卡顿检测。 public class DemoApplication extends Application { @Override public void onCreate() { // ... // Do it on main process BlockCanary.install(this, new AppBlockCanaryContext()).start(); }}这段代码次要有两局部,一部分是install,一部分是start。咱们先看install局部 install阶段BlockCanary#install()public static BlockCanary install(Context context, BlockCanaryContext blockCanaryContext) { //BlockCanaryContext.init会将保留利用的applicationContext和用户设置的配置参数 BlockCanaryContext.init(context, blockCanaryContext); //etEnabled将依据用户的告诉栏音讯配置开启 setEnabled(context, DisplayActivity.class, BlockCanaryContext.get().displayNotification()); return get(); }BlockCanary#get()//应用单例创立了一个BlockCanary对象 public static BlockCanary get() { if (sInstance == null) { synchronized (BlockCanary.class) { if (sInstance == null) { sInstance = new BlockCanary(); } } } return sInstance;}BlockCanary() private BlockCanary() { //初始化blockCanaryInternals调度类 BlockCanaryInternals.setContext(BlockCanaryContext.get()); mBlockCanaryCore = BlockCanaryInternals.getInstance(); //为BlockCanaryInternals增加拦截器(责任链)BlockCanaryContext对BlockInterceptor是空实现 mBlockCanaryCore.addBlockInterceptor(BlockCanaryContext.get()); if (!BlockCanaryContext.get().displayNotification()) { return; } //DisplayService只在开启告诉栏音讯的时候增加,当卡顿产生时将通过DisplayService发动告诉栏音讯 mBlockCanaryCore.addBlockInterceptor(new DisplayService()); }BlockCanaryInternals.getInstance()static BlockCanaryInternals getInstance() { if (sInstance == null) { synchronized (BlockCanaryInternals.class) { if (sInstance == null) { sInstance = new BlockCanaryInternals(); } } } return sInstance;}BlockCanaryInternalspublic BlockCanaryInternals() { //初始化栈采集器 stackSampler = new StackSampler( Looper.getMainLooper().getThread(), sContext.provideDumpInterval()); //初始化cpu采集器 cpuSampler = new CpuSampler(sContext.provideDumpInterval()); //初始化LooperMonitor,并实现了onBlockEvent的回调,该回调会在触发阈值后被调用,这外面比拟重要 setMonitor(new LooperMonitor(new LooperMonitor.BlockListener() { @Override public void onBlockEvent(long realTimeStart, long realTimeEnd, long threadTimeStart, long threadTimeEnd) { ArrayList<String> threadStackEntries = stackSampler .getThreadStackEntries(realTimeStart, realTimeEnd); if (!threadStackEntries.isEmpty()) { BlockInfo blockInfo = BlockInfo.newInstance() .setMainThreadTimeCost(realTimeStart, realTimeEnd, threadTimeStart, threadTimeEnd) .setCpuBusyFlag(cpuSampler.isCpuBusy(realTimeStart, realTimeEnd)) .setRecentCpuRate(cpuSampler.getCpuRateInfo()) .setThreadStackEntries(threadStackEntries) .flushString(); LogWriter.save(blockInfo.toString()); if (mInterceptorChain.size() != 0) { for (BlockInterceptor interceptor : mInterceptorChain) { interceptor.onBlock(getContext().provideContext(), blockInfo); } } } } }, getContext().provideBlockThreshold(), getContext().stopWhenDebugging())); LogWriter.cleanObsolete(); }当install进行初始化实现后,接着会调用start()办法,实现如下: ...

April 28, 2022 · 4 min · jiezi

关于android:App-出海-Google-结算系统面面观

图片起源:https://unsplash.com/photos/r... 本文作者:zoulp 近年来中国移动利用出海势头良好。对于波及到交易业务的出海利用来说,Google 利用内领取是必不可少的领取渠道。不同于国内绝对欠缺的挪动领取体系,即便官网文档中对如何接入 Google 利用内领取做了根本论述,然而在接入的过程中,还是会遇到很多问题。本文将介绍交易的重点流程和核心技术要点,以及须要留神的问题。 接入过程名词解释首先解释三对概念来帮忙了解 Google 领取的逻辑。 一次性商品 vs 订阅型商品 一次性商品是通过单次购买取得的商品。一次性商品又分为消耗型商品和非消耗型商品,消耗型商品顾名思义是能够被耗费的商品,例如 App 提供的金币或虚构货币,用户能够反复购买。非消耗型商品是通过一次购买能够失去的永恒权利,例如付费降级的内容。 订阅型商品是指会定期产生购买行为的商品,如会员服务等,订阅会主动续期,直至勾销。 本文的探讨仅限于消耗型商品,不波及其余类型的商品。 Consume vs Acknowledge Consume 和 Acknowledge 均有实现领取后进行确认的含意,但两者并不完全相同。 Acknowledge 是实际意义上的确认操作,进行了 Acknowledge 会使得订单不被退款,Acknowledge 可由客户端 API acknowledge()) 执行,也可由 Google 服务端 API acknowledge() 实现。 Google 会对已领取但未确认的订单在三天后进行主动退款解决。 Consume 是专门针对消耗型商品的操作,Consume 不仅蕴含确认的含意,并使得商品能够反复购买。Consume 能够看成是蕴含了 Acknowledge 操作,Consume 仅可由客户端 API consumeAsync() 实现,不能通过服务端 API 进行。 业务服务端 vs Google 服务端 本文中将屡次提到对于服务端的操作,别离应用业务服务端和 Google 服务端来进行辨别,防止混同。业务服务端指的是 App 业务逻辑的服务端。Google 服务端在本文特指 Google 利用内领取的服务端,由 Google 提供。 交易流程概览从业务的角度登程,一次交易流程能够大体用下图示意: 但在理论交易的过程中,充斥了不确定的因素,如用户的网络环境不稳固、误操作等等。因为交易业务的敏感性,既不能让用户多付钱,也不能少付、错付。因而须要全面思考各种可能呈现的状况,对可能导致订单和领取状态异样的因素做充沛的考量和处理。站在技术的视角,残缺的交易流程如下: ...

April 28, 2022 · 2 min · jiezi

关于android:浏览器扫码打开AndroidiOS-App

关上浏览器,扫描某个二维码时须要启动特定的App,要实现这样的需要,咱们首先须要解析HTML页面的二维码,通常解析后的内容格局为: <a href="[scheme]://[host]/[path]?[query]">启动App</a> //测试链接<a href="myapp://jp.app/openwith?name=zhangsan&age=26">启动App</a> scheme:判断启动的App。host:适当记述。path:传值时必须的key,没有能够不传。query:获取值的Key和Value,没有能够不传。首先,咱们关上Android工程的AndroidManifest.xml配置文件,而后在启动页面Activity下追加以下内容。 <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/openwith"/> </intent-filter>须要阐明的是,intent-filter的内容【android.intent.action.MAIN】和 【android.intent.category.LAUNCHER】这2个,不能与这次追加的内容混合在一起。因为如果退出了同一个Activity,会导致利用图标在桌面隐没等问题,所以个别状况配置如下。 <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="jp.app" android:pathPrefix="/openwith"/> </intent-filter> 接下来,在Activity中须要取值的中央增加以下代码,能够间接写在OnCreate函数里的。 val value = intent val action = value.action if (Intent.ACTION_VIEW == action) { val uri: Uri? = value.data if (uri != null) { val name: String? = uri.getQueryParameter("name") val age: String? = uri.getQueryParameter("age") ... //解决业务 } }通过下面的解决后,就能够实现浏览器扫码关上Android/iOS App的性能了。须要留神的是,肯定要用自带浏览器或者谷歌浏览器,不要用什么Uc、腾讯浏览器。 ...

April 28, 2022 · 1 min · jiezi

关于android:上新啦KIT

上新啦!KIT!近期KIT上新榜单请查收~ 商业推广深度转化事件回传助力用户精密经营,衰弱数据凋谢晋升静止衰弱服务体验、手语服务新增非手控局部…… 更多功能请点击 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

April 28, 2022 · 1 min · jiezi

关于android:Android-13-Beta-版发布诸多亮点不容错过

作者 / Dave Burke, VP of Engineering 四月已至,咱们仍在一直稳步推动欠缺 Android 13 的性能和稳定性。Android 13 围绕咱们的 外围主题 打造,即隐衷和平安、开发者生产力,以及反对平板电脑和大屏幕设施。明天,咱们进入到公布周期的下一个阶段,为大家带来 Android 13 的第一个 Beta 版。 对于开发者来说,Android 13 有很多值得摸索的中央,从新的告诉权限和照片选择器等隐衷性能,到帮忙您构建良好体验的 API (如主题利用图标、将磁贴增加至疾速设置和单个利用语言偏好),以及蓝牙低功耗 (LE) 音频和通过 USB 连贯 MIDI 2.0 硬件等性能。在 Beta 1 中咱们也带来了许多改良,比方减少了新的权限,让您能够更精密地拜访媒体文件,以及改良了音频路由 API,等等。咱们将在 5 月 11 日至 12 日举办的 Google I/O 大会上分享更多信息,届时请务必收看! 咱们诚邀您来试用明天的 Beta 版本,也欢送更多的晚期体验用户参加进来,为咱们提供对于这个版本的 反馈信息。明天您就能够在受反对的 Pixel 设施上开始体验 Android 13 Beta 1,只需 注册参加测试,即可通过 OTA 形式取得更新。如果您曾经装置了 Android 13 的开发者预览版,您的设施将主动通过 OTA 形式取得本次和后续版本的更新。和以往一样,咱们也反对将零碎映像 下载并刷入 Pixel 设施,以及在 Android 模拟器 中应用。请拜访 Android 13 开发者网站理解更多开始开发和测试利用的细节。 ...

April 28, 2022 · 2 min · jiezi

关于android:一步步基于ViewModel协程搭建通用网络请求工具

本文次要介绍如何在ViewModel封装通用的网络申请,不过在真正介绍封装前先解说下应用到的基础知识:协程中异样的捕捉1.协程中异样的捕捉协程中异样捕捉的形式有两种: 常见的try-catch相比拟于CoroutineExceptionHandler,这种形式能够灵便的捕获可能产生异样的代码块: lifecycleScope.launch { //省略其余逻辑代码 try { val result = 8 / 0 } catch (e: Exception) { } //省略其余逻辑代码}协程上下文元素CoroutineExceptionHandler这种形式捕获的异样是间接捕获的整个协程块的异样,颗粒度比拟大,短少灵活性。 lifecycleScope.launch(CoroutineExceptionHandler { _, throwable -> Log.e("ChapterActivity", "exception occur: ${throwable.message}")}) { //省略其余逻辑代码 val result = 8 / 0 //省略其余逻辑代码}2.封装网络申请首先定义一个类,类中别离定义三种函数类型属性,别离用作:发动申请、申请胜利、申请失败。 class Action<T> { //发动申请 var request: (suspend () -> Response<T>)? = null private set //申请胜利 var success: ((T) -> Unit)? = null private set //申请失败 var error: ((Throwable) -> Unit)? = null private set fun request(block: suspend () -> Response<T>) { request = block } fun success(block: (T) -> Unit) { success = block } fun error(block: (Throwable) -> Unit) { error = block }}data class Response<T>(val code: Int = -1, val data: T? = null)定义一个扩大函数netRequest,以DSL的形式创立Action<T>对象: ...

April 27, 2022 · 1 min · jiezi

关于android:安卓模拟器与真机有什么差别

1.模拟器上装置的apk签名是debug模式的,公布利用到市场上要用另外的签名。 2.模拟器上用px像素能够失常显示,但在真机测试上有可能布局变得面目全非,很难看,真机上必须用dip让零碎自动识别能力达到预期成果。 3.模拟器上空格用\t能够失常显示,但到真机(ME525+)上就不起作用了。 4.模拟器调用邮件服务报错,到真机上会弹出抉择。还有其余一些性能也是如此。 5.模拟器上创立快捷方式的提醒和真机的差异比拟大,模拟器上提醒有局部英文的,真机上全中文的,而且有间断几个不同内容的提醒。 6.模拟器上看到的输入框成果比拟大,真机上看显著小了很多。 举荐浏览: 什么是手游性能测试,该如何做? APP功能测试纲要 手机功能测试次要测哪些方面? 软件兼容性测试的测评指标有哪些? web的兼容性测试次要测什么?

April 27, 2022 · 1 min · jiezi

关于android:有奖调研华为分析服务诚邀您参与您的真实反馈可以让我们变得更好

理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

April 27, 2022 · 1 min · jiezi

关于android:3种方法实现Android按钮的点击事件建议收藏

Button是程序用于和用户进行交互的一个重要控件,置信大家对这个控件曾经十分相熟了,咱们平时用的最多的控件之一。既然有Button,那必定有onClick办法,上面就教大家三种实现点击事件的办法,大家抉择一种本人喜爱的形式写就能够了。咱们先在layout文件外面搁置一个Button控件,很简略,让它程度和垂直都居中,Button外面的文字也居中对齐,字体大小15sp,内容为“我是按钮”,具体代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ButtonActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:gravity="center" android:text="我是按钮" android:textSize="15sp" /></RelativeLayout>运行一下模拟器,显示如下: 上面,咱们来实现按钮点击事件:只有咱们点击按钮,就会弹出Toast提示信息,内容为“按钮被点击了”。 | 一、匿名外部类实现 | |--|--| 在onCreate()办法外面申明并绑定控件,而后注册监听器,重写onClick()办法,只有在onClick()办法中退出待处理的逻辑就行。 这里咱们只用Toast显示了一条音讯。所有代码如下: public class ButtonActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_button); Button button=findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(ButtonActivity.this,"按钮被点击了",Toast.LENGTH_SHORT).show(); } }); }}这样,只有咱们点击按钮,就会执行监听器中的onClick()办法,成果如下: | 二、接口实现 | |--|--| 第二种办法只有援用View.OnClickListener这个接口就行,接着Button button=findViewById(R.id.button);用来申明和绑定button控件,button.setOnClickListener(this);设置button的监听器,这两者缺一不可。上面就是重写onClick()办法,个别应用switch语句,参数是view,能够依据不同id来赋予不同的点击事件,不必像下面匿名外部类那样每一个按钮都要独自设置一下点击事件。所有代码如下: public class ButtonActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_button); Button button=findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: Toast.makeText(this,"按钮被点击了",Toast.LENGTH_SHORT).show(); default: break; } }}咱们运行看下成果: ...

April 26, 2022 · 1 min · jiezi

关于android:场景化组件开源融云持续回馈开源生态

Talk is cheap. Show me the code.关注【融云寰球互联网通信云】理解更多 这句话置信大家都不生疏,甚至是不少开发者的信条。这是 Linus Torvalds 最为人称道的金句,而提起他,人们还会立马联想到另一个词,开源。 上世纪九十年代,Linus Torvalds 采纳自由软件许可证—— GNU 通用公共许可证,公布了 Linux,成为过后开源浪潮的主战场。尔后,Linux 在成千上万开发者的奉献下,逐步成为世界上最受欢迎的操作系统。 二十几年过来了,业界对于开源与商业的龃龉仍然未解。但开源在寰球范畴内的高速倒退曾经让人无奈漠视。 事实上,软件开发自身就是一种社会化的、集体性的智慧流动,大部分的软件是基于开源基础架构搭建的,复用大量已有的库和工具。 开源不仅仅是程序员的技术信奉,更是寰球软件技术和产业翻新的主导模式,是减速根底软件翻新,增强社会合作,晋升效率、裁减生态的高效形式。 作为以开发者为核心的科技企业,开办 8 年来,融云始终是开源生态的参与者和贡献者。近期,融云将多个场景化组件开源,蕴含音乐播放、聊天室、语聊房、视频直播、语音电台、音视频通话等开箱即用的 UI 解决方案。 这是融云在封装最佳行业实际推出第三代场景化 SDK,扭转行业供应旧范式之后,进一步服务行业,回馈社区的要害之举。期待收到更多开发者的反馈,独特推动行业倒退。 融云场景化组件开源欢送开发者应用和反馈1. 场景化音乐播放组件场景化音乐 Kit 是融云为开发者提供的开源我的项目,实用于语聊房、电台房、视频直播等常见社交场景。Kit 封装了音乐播放列表、音乐库列表、音量控制、气氛管制等常见 UI 组件。开发者只需提供音乐数据源并且依据相干回调设置 RTC 相干管制,即可疾速实现房间内音乐播放等性能。(融云场景化音乐播放组件) 性能组件① 音乐播放列表音乐列表提供了常见的音乐播放、暂停、置顶、删除等逻辑及 UI 性能展现,开发者能够依据回调执行相应的混音操作或播放器播放操作即可。播放/暂停:点击音乐条目可执行播放和暂停的回调,开发者能够管制房间内的音乐混音的开始和暂停逻辑。 置顶:每个音乐条目前面有置顶按钮,开发者可点击置顶,把想要置顶的音乐挪动到正在播放的音乐的下方。 删除:每个音乐条目前面有删除按钮,能够把该音乐移除播放列表。 ② 音乐库音乐库列表提供了常见的音乐增加、搜寻、分页加载等逻辑及 UI 性能展现,开发者能够依据回调提供相应的数据即可失常显示。 分类展现:可依照歌曲分类展现不同的音乐列表。 列表展现:音乐列表依照开发者提供的音乐数据做展现,反对增加到播放列表性能,分页加载性能,本地上传性能(上传后增加到播放列表)。 搜寻歌曲:输出想搜寻的歌曲,点击搜寻后,会回调音乐搜寻的接口,开发者只需在本人的曲库中做搜寻而后把数据传递给列表即可展现搜寻后果。 ③ 音量控制音乐管制提供了常见的房间内音量控制,包含本端音量、远端音量、麦克风音量、混音等性能,开发者能够依据回调操作具体的音量设置。 本端音量:个别指主播端播放的音量,能够依据回调设置本端音量。 远端音量:个别指观众端播放的音量,能够依据回调设置远端音量。 麦克风音量:个别指主播端谈话时麦克风传入的音量,能够依据回调设置麦克风音量。 耳返:个别指主播端戴耳机的状况下,是否开启耳机耳返性能,能够依据回调管制。 ④ 气氛管制气氛管制提供了一些进场气氛音效治理,开发者能够依据本人业务需要定制一些进场音效,依据数据回调返回 UI 层做展现,当点击相应的气氛时,调用 RTC 相应的气氛播放 API。 个性集成简略:用户只须要依赖远端仓库或开源我的项目的源码即可疾速应用。 功能完善:常见的播放列表、音乐库、音量控制、气氛管制等一应俱全,用户可依据本身须要做减少或删减。 可定制化:在源码的根底上,用户能够依据本人业务需要改变相应代码即可疾速定制化。 可用性强:用户只需关怀数据源和相应的操作回调,外部没有封装 RTC 任何逻辑,依据回调调用相应 RTC 的 API 即可。 ...

April 26, 2022 · 1 min · jiezi

关于android:有奖调研-即时消息服务的产品需求规划就交给你了

你或者不晓得它在什么时候横空出世,当你意识到的时候,它已如空气盘绕在你身边。 截至2021年6月,我国即时通信用户规模达到9.83亿,以97%的网民应用占比,在用户量级之巅一览众山小。明天就来聊聊这个“如空气般存在”的能力——IM(Instant Messaging)即时消息。(数据来自中国互联网络信息中心(CNNIC)第48次《中国互联网络倒退情况统计报告》) 有线上沟通需要的中央,就有IM 咱们在社交利用上与好友的每次分享与畅聊,剁手前在电商App里与店铺客服的商品信息确认,工作群中和共事的高效沟通和收发文件,外卖送达时小哥发来的实时取餐音讯,还有组队开黑时与队友激情沟通游戏策略…… IM这个“能处”的能力,就像身材延长进去的、突破时空限度的表白“器官”,真正实现了社交沟通、办公协同、智能客服、零碎音讯、互动直播、物联网通信等多场景笼罩,成为泛滥App的必备功能模块。 IM+X:从沟通登程,不止沟通 IM的利用幅员逐渐扩大至千行百业,它的爆火出圈,不仅是因其不断丰富欠缺的沟通连贯力,IM还继续为现有的利用场景提供新的解决方案,为咱们带来更多设想。 IM+电商,客服沟通根底上,融入社群经营、直播互动,性能催生新玩法,拉新、促活全笼罩;IM+金融,用户金融理财体验全降级,从获客、业务征询办理到服务售后,IM买通和撑持了金融企业与用户平安即时沟通的关键环节。还有IM在医疗畛域的诸多使用,传统就医模式大降级,线上医患沟通,直播连麦就诊等模式,优化医疗资源分配,真正实现了便民利民…… IM的继续出圈之路上,性能优化降级和新的价值利用场景须要您的业余视角和倡议,融入日常生活的IM能力,它的倒退方向您来定义。咱们诚邀您参加本次IM即时消息用户调研,分享见解,大奖等您来拿。 有奖调研!IM即时消息性能及市场需求调研 【奖项设置】一等奖(1名):华为智能眼镜(价值1699元) 二等奖(2名):华为手环6 Pro 炫彩全面屏(价值449元) 三等奖(3名):华为AI音箱 2e(价值199元) 【立刻参加填写问卷】形式①:手机扫码填写问卷 形式②:PC端点击“立刻参加” 【评奖规定】专家评审将从问卷反馈内容的业余度和价值度等角度进行评分,如合乎评比规定要求的回复有余时,奖项可空缺。 【隐衷申明】本次调研内容不会收集您任何的隐衷信息,您在回复内容时留神请勿波及第三方窃密信息。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

April 26, 2022 · 1 min · jiezi