• [技术干货] Android 主题 vs 样式-转载
    一、导读 我们继续总结学习基础知识,温故知新。 本文我们总结下 android主题与样式的异同。 二、概览 Android样式系统提供了一种强大的方式来指定应用程序的视觉设计,但它很容易被误用。正确使用它可以使主题和样式更易于维护,使品牌更新不那么可怕,并使支持黑暗模式变得简单。 在文章中,我将介绍样式系统的构建块:主题和样式。 三、相关知识 3.1 theme!= style 主题和样式都使用相同的 样式是视图(view)属性值的集合,键都是视图属性,即小部件声明的属性,而且样式中的每个键都可以在布局中设置, 是针对View或者窗口(Window)设置外观或者格式的一个属性集合,比如可以指定:宽高尺寸、字体颜色、字号、背景颜色等属性。 主题(Theme)针对Activity或者Application(应用)设置外观或者格式的一个属性集合; 主题可以理解成某一种特殊的样式,定义主题和样式都是基于标签添加相应的属性; 3.2 theme 与 style区别 使用方式不同 我们在使用上也是有区别的, 如果是样式,则使用style=“@style/xxx” eg: <style name="Widget.Plaid.Button.InlineAction" parent="…">   <item name="android:gravity">center_horizontal</item>   <item name="android:textAppearance">@style/TextAppearance.CommentAuthor</item>   <item name="android:drawablePadding">@dimen/spacing_micro</item> </style> 我们看个button,里面的每个属性都跟上面一一对应。 <Button …   android:gravity="center_horizontal"   android:textAppearance="@style/TextAppearance.CommentAuthor"   android:drawablePadding="@dimen/spacing_micro"/> 如果是样式,则使用android:theme=“@style/xxx” <!-- AndroidManifest.xml --> <application …   android:theme="@style/Theme.Plaid"> <activity …   android:theme="@style/Theme.Plaid.About"/> <!-- layout/foo.xml --> <ConstraintLayout …   android:theme="@style/Theme.Plaid.Foo"> 作用范围不同 应用于视图的样式仅应用于该视图,而不应用于其任何子视图。 而主题可用于整个应用,整个activity等。 五、 推荐阅读 Java 专栏 SQL 专栏 数据结构与算法 Android学习专栏 ———————————————— 版权声明:本文为CSDN博主「Android西红柿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/fumeidonga/article/details/134063813 
  • [问题求助] Android 华为云会议sdk demo集成。初始化时 出现No implementation found for boolean ...jni.HwmPrivateNativeSDK.needKeepCall()
    Android 华为云会议sdk  demo集成。初始化时 出现No implementation found for boolean ...jni.HwmPrivateNativeSDK.needKeepCall()
  • [问题求助] android 扬声器切听筒几秒钟后自动切回扬声器
    如题,android 开发音频播放,手机贴近耳朵时使用听筒播放,我的mate 30使用听筒播放几秒后,自动切回了扬声器播放,目前测试的小米手机没发现这个问题,各位大神是否遇到同样问题,如何解决?使用方法如下:audioManager?.mode = AudioManager.MODE_IN_COMMUNICATIONif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val speakerDevice: AudioDeviceInfo? = getAudioDevice(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) speakerDevice?.run { audioManager?.setCommunicationDevice(this) }} else { audioManager?.isSpeakerphoneOn = false}
  • [问题求助] Android打包时出现. Received status cc 403 from server: Forbidden
    AILURE: Build failed with an exception. * What went wrong: Could not determine the dependencies of task ': app: compileOnlineReleaseJavawithJavac' > Could not resolve all task dependencies for configuration ':app:onlineReleaseCompileclasspath' > Could not resolve androidx. activity:activity: [1.2.1]. Required by: project :app> androidx.activity: activity-ktx:1.2.1 > Failed to list versions for android.activity: activity. > Unable to load Maven meta-data from https://developer.huawei.com/repo/android/activity/activity/maven-metadata.xmi. > Could not HEAD 'https://developer.huawei.com/repo/android/activity/activity/maven-metadata.xmI'. Received status cc 403 from server: Forbidden在workflow打包出现这个报错,本地打包没有问题。
  • [技术干货] Android Studio期末大作业---快递管理APP快递查询APP-转载
     快递管理APP 主要功能 主要实现功能:登录,注册,数据库的增删改查(新增快递,查询快递,修改快递信息,删除快递信息)  页面展示如下 登录注册  注册时会判断两次密码是否输入一致!!!  系统首页 两个按钮实现页面的跳转。  public class IndexActivity extends AppCompatActivity {     Button cha;     Button zeng;     String name=null;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_index);          cha=(Button)findViewById(R.id.cha);         zeng=(Button)findViewById(R.id.zeng);         cha.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 Intent intent1=new Intent(IndexActivity.this,chaActivity.class);                 startActivity(intent1);             }         });         Intent intent=this.getIntent();         name=intent.getStringExtra("username");         zeng.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 Intent intent2=new Intent(IndexActivity.this,zengActivity.class);                 intent2.putExtra("username",name);                 startActivity(intent2);             }         });      } } 新增快递  查询快递信息 输入快递单号进行查询  修改快递信息  删除信息 button4.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View view) {                 db.delete("kuaidi","danhao=?",new String[]{danhao});                 Intent intent=new Intent(jieguoActivity.this,IndexActivity.class);                 startActivity(intent);             }         }); 开发环境 SQLite数据库 jdk1.8 Android studio3.5.2 ———————————————— 版权声明:本文为CSDN博主「小布丁*」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_45757641/article/details/128110756 
  • [技术干货] Flutter悬浮UI的设计Overlay组件-转载
     APP开发经常要遇到的开发场景 有时候我们在开发APP的时候会遇到下面这些需求: 在现有页面上添加浮动的悬浮按钮、气泡或菜单。 实现全局的通知或提示弹窗。 创建自定义的导航栏、底部导航或标签栏。 构建模态对话框或底部弹出菜单。 在屏幕上展示悬浮窗,比如 Flutter 版本的 Toast,任意位置的 PopWindow 等等。 自定义Toast。 在页面顶部悬浮某个widget。 等等。 这些场景都有一个共同特点,需要在当前UI上悬浮显示特定的UI。要用flutter来实现这些效果就要引出今天要学习的Overlay组件。 Overlay 的介绍 当需要在 Flutter 应用中在现有 UI 层上添加新的视图或交互时,可以使用 Overlay 组件。Overlay 允许将一个或多个小部件(称为 OverlayEntry)叠加在应用的现有 UI 上。 Overlay包括两个基本组件:OverlayState和OverlayEntry。OverlayState管理所有OverlayEntry,OverlayEntry定义覆盖层的内容。  Overlay的使用规则 创建一个 Overlay 对象,通常使用 Overlay.of(context) 方法获取当前上下文中的 Overlay 对象。 创建一个或多个 OverlayEntry 对象,这些对象将成为 Overlay 的子项。 将 OverlayEntry 添加到 Overlay 中,通常使用 OverlayEntry 的 insert 或 add 方法。 当需要显示或隐藏叠加层时,调用 OverlayEntry 的 markNeedsBuild 方法,并在 build 方法中定义要显示的小部件。 可选:通过调整 OverlayEntry 的位置、大小和布局参数来控制叠加层的位置和样式。 举例说明 下面通过一个简单的例子来说明:例子要实现点击一个按钮会打开Overlay显示一个FloatingActionButton。  源码 import 'package:flutter/material.dart';  void main() {   runApp(MyApp()); }  class MyApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return MaterialApp(       home: Scaffold(         appBar: AppBar(           title: Text('Flutter Overlay Example'),         ),         body: Center(           child: ElevatedButton(             child: Text('Open Overlay'),             onPressed: () {               showFloatingButtonOverlay(context);             },           ),         ),       ),     );   } }  void showFloatingButtonOverlay(BuildContext context) {   OverlayState? overlayState = Overlay.of(context);   late OverlayEntry overlayEntry;    // 创建 OverlayEntry   overlayEntry = OverlayEntry(     builder: (BuildContext context) {       return Positioned(         top: 100,         right: 16,         child: FloatingActionButton(           onPressed: () {             // 悬浮按钮被点击             print('Floating Button Clicked');             overlayEntry.remove(); // 移除 OverlayEntry           },           child: Icon(Icons.add),         ),       );     },   );    // 将 OverlayEntry 添加到 Overlay 中   overlayState?.insert(overlayEntry); } 运行结果如图:  例子报错 本来想直接贴正确的代码的,但是觉得这个错误对初学者来说很容易犯,故单独列出来。  报错No Overlay widget found 点击Open Overlay按钮报错No Overlay widget found。如下图  报错原因 该错误提示是因为在使用 Overlay.of(context) 方法时,找不到可用的 Overlay 对象。  解决方法 确保按钮所在的 BuildContext 对象正确。在上述示例中,按钮的 onPressed 回调中使用的 BuildContext 应该是 Scaffold 的上下文,确保按钮在正确的上下文中定义和使用。  确保 Overlay 被正确地放置在应用的组件树中。在上述示例中,Overlay 组件应该在 MaterialApp 或 WidgetsApp 的下方,以确保它们在正确的层次结构中。  修改后的源码 import 'package:flutter/material.dart';  void main() {   runApp(MyApp()); }  class MyApp extends StatelessWidget {   @override   Widget build(BuildContext context) {     return MaterialApp(       home: OverlayExample(), // 使用 OverlayExample 作为主页     );   } }  class OverlayExample extends StatelessWidget {   @override   Widget build(BuildContext context) {     return Scaffold(       appBar: AppBar(         title: Text('Flutter Overlay Example'),       ),       body: Center(         child: ElevatedButton(           child: Text('Open Overlay'),           onPressed: () {             showFloatingButtonOverlay(context);           },         ),       ),     );   } }  void showFloatingButtonOverlay(BuildContext context) {   OverlayState? overlayState = Overlay.of(context);   late OverlayEntry overlayEntry;    // 创建 OverlayEntry   overlayEntry = OverlayEntry(     builder: (BuildContext context) {       return Positioned(         top: 100,         right: 16,         child: FloatingActionButton(           onPressed: () {             // 悬浮按钮被点击             print('Floating Button Clicked');             overlayEntry.remove(); // 移除 OverlayEntry           },           child: Icon(Icons.add),         ),       );     },   );    // 将 OverlayEntry 添加到 Overlay 中   overlayState?.insert(overlayEntry); } ———————————————— 版权声明:本文为CSDN博主「江上清风山间明月」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yikezhuixun/article/details/131283414 
  • [技术干货] 如何用Android Studio实现登录跳转-转载
     前言 这个项目是我很早的时候写的,现在将其发上来供大家参考。可能存在一些不规范的问题,如有不对,欢迎批评指正。首先需要安装配置好Java开发环境,并选择任意一款Android开发工具进行编程,推荐下载安装Android Studio软件进行程序开发。在开始进行Android编程开发之前需要对Java基础知识有一定的了解和掌握。  一、基本要求 实现一个简单的用户登录界面,功能如下:  1、默认不存储用户信息,默认隐藏密码。  2、能通过勾选框记住密码、显示密码,点击登录后实现页面跳转至主页面。  3、通过“登录”进入主界面,通过“退出”退出APP,主界面通过“返回”返回到登录页面  4、登录界面显示登录的用户名及当前用户的登录时间  二、关键代码分析 1、在进行登录跳转时,manifest.xml必须写入新活动名,否则无法实现跳转  <activity android:name=".WelcomeActivity"/> 2、从SharedPreferences中获取是否记住当前用户的相关参数(登录名及密码),设置账号与密码到文本编辑框,并勾选记住当前用户名与密码  //从SharedPreferences中获取是否记住密码的参数         final SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(this);         boolean isRemember = preference.getBoolean("remember_pwd", false);         //设置账号与密码到文本框,并勾选记住密码         if (isRemember) {             username.setText(preference.getString("name", ""));             password.setText(preference.getString("password", ""));             remember_pwd.setChecked(true);         } 3、设置用户名和密码校验;如果校验成功且勾选记住密码,保存密码和用户名,如未勾选,登录成功后清除保存的数据   String inputName = username.getText().toString();                 String pwd = password.getText().toString();                 //进行登录用户名和密码校验                 if (inputName.equals("老王") && pwd.equals("123456789")) {                     SharedPreferences.Editor editor = preference.edit();                     if (remember_pwd.isChecked()) {//记住账号与密码                         editor.putBoolean("remember_pwd", true);                         editor.putString("name", inputName);                         editor.putString("password", pwd);                     } else {//清空数据                         editor.clear();                     }                     editor.apply(); 4、跳转至主界面WelcomeActivity.java   WelcomeActivity.actionStart(MainActivity.this, inputName, pwd); 5、是否显示密码,默认不勾选显示密码  @Override   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {     if (isChecked) {     //如果选中,显示密码       editText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());            }      else {     //否则隐藏密码     editText.setTransformationMethod(PasswordTransformationMethod.getInstance());           }        } 6、退出登录  cancel.setOnClickListener(new View.OnClickListener() {                                       @Override                                       public void onClick(View v) {                                           finish();                                       }                                   }); 7、登录成功后,用户名显示  //登录成功后,用户名显示     private void showWelcome() {         Bundle bundle = getIntent().getExtras();         String name = bundle.getString("username");         myWelcome.setText("\n" + name + " 您好!\n    欢迎光临");     }  8、获取当前的登录时间  private void showTime() {         SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");         Date curDate = new Date(System.currentTimeMillis());         //获取当前时间         String str = formatter.format(curDate);         myTime.setText("您的登录时间为:"+str);     } 三、页面代码展示 activity_main.xml:  <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/relativeLayout"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="@drawable/b03533fa828ba61e560f92ebd1da230f324e5901"     tools:context=".MainActivity">       <EditText         android:id="@+id/editText1"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_marginStart="75dp"         android:layout_marginEnd="32dp"         android:hint="请输入用户名"         app:layout_constraintBottom_toTopOf="@+id/editText2"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintHorizontal_bias="0.0"         app:layout_constraintStart_toStartOf="parent"         android:maxLines="1"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.972" />       <EditText         android:id="@+id/editText2"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:layout_marginStart="75dp"         android:layout_marginEnd="32dp"         android:hint="请输入密码"         android:inputType="textPassword"         app:layout_constraintBottom_toBottomOf="parent"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintHorizontal_bias="0.0"         app:layout_constraintStart_toStartOf="parent"         android:maxLines="1"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.546" />       <TextView         android:id="@+id/textView2"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_marginTop="16dp"         android:layout_marginBottom="16dp"         android:text="用户登录"         android:textSize="28sp"         android:textStyle="bold"         app:layout_constraintBottom_toTopOf="@+id/editText1"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toTopOf="parent"         app:layout_constraintVertical_bias="0.89" />       <Button         android:id="@+id/button_login"         style="@style/AlertDialog.AppCompat.Light"         android:layout_width="match_parent"         android:layout_height="45dp"         android:layout_gravity="center_horizontal"         android:layout_marginLeft="30dp"         android:layout_marginTop="32dp"         android:layout_marginRight="30dp"         android:backgroundTint="@android:color/holo_blue_dark"         android:text="登录"         app:layout_constraintEnd_toStartOf="@+id/button_quit"         app:layout_constraintHorizontal_bias="0.0"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toBottomOf="@+id/editText2" />       <Button         android:id="@+id/button_quit"         style="@style/AlertDialog.AppCompat.Light"         android:layout_width="match_parent"         android:layout_height="45dp"         android:layout_gravity="center_horizontal"         android:layout_marginStart="30dp"         android:layout_marginTop="76dp"         android:layout_marginEnd="30dp"         android:text="退出"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toBottomOf="@+id/editText2" />       <CheckBox         android:id="@+id/checkBox1"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="显示密码"         app:layout_constraintStart_toStartOf="@+id/button_login"         app:layout_constraintTop_toBottomOf="@+id/editText2" />       <CheckBox         android:id="@+id/checkBox2"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="记住密码"         app:layout_constraintEnd_toEndOf="parent"         app:layout_constraintHorizontal_bias="0.3"         app:layout_constraintStart_toStartOf="@+id/checkBox1"         app:layout_constraintTop_toBottomOf="@+id/editText2" />       <TextView         android:id="@+id/textView"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_marginStart="24dp"         android:text="用户:"         android:textSize="20sp"         android:textStyle="bold"         app:layout_constraintBottom_toTopOf="@+id/editText2"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toTopOf="@+id/editText1"         app:layout_constraintVertical_bias="0.37" />       <TextView         android:id="@+id/textView4"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_marginStart="24dp"         android:text="密码:"         android:textSize="20sp"         android:textStyle="bold"         app:layout_constraintBottom_toBottomOf="@+id/editText2"         app:layout_constraintStart_toStartOf="parent"         app:layout_constraintTop_toBottomOf="@+id/textView"         app:layout_constraintVertical_bias="0.718" />     </androidx.constraintlayout.widget.ConstraintLayout> welcome.xml:  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent" android:layout_height="match_parent">       <TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="网上购书系统"         android:id="@+id/textView"         android:layout_alignParentTop="true"         android:layout_centerHorizontal="true"         android:textSize="@dimen/abc_text_size_headline_material"         android:textStyle="bold"         android:textColor="@android:color/holo_blue_dark" />       <TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:textAppearance="?android:attr/textAppearanceLarge"         android:text="\n您好!\n欢迎光临"         android:id="@+id/myLabelWelcome"         android:layout_below="@+id/textView"         android:layout_centerHorizontal="true"         android:textSize="@dimen/abc_text_size_large_material"         android:textColor="@android:color/holo_red_dark" />       <ImageView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:id="@+id/imageView"         android:src="@drawable/androidwelcomer"         android:layout_below="@+id/myLabelWelcome"         android:layout_centerHorizontal="true" />       <TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text=""         android:id="@+id/myLabelTime"         android:layout_below="@+id/textView"         android:layout_centerHorizontal="true"         android:textSize="@dimen/abc_text_size_medium_material" />       <Button         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="返      回"         android:id="@+id/myButtonBack"         android:layout_below="@+id/imageView"         android:layout_centerHorizontal="true"         android:textSize="@dimen/abc_text_size_large_material"         android:onClick="onBackClick" /> </RelativeLayout> ———————————————— 版权声明:本文为CSDN博主「数产小黑娃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_53860947/article/details/125852035 
  • [其他问题] Android读取大量数据的Excel文件的有效方法
        Android项目需求读取大量数据的excel(.xlsx格式)的内容,但是我这两天去网上搜索到的Apache-poi和jxl去读取excel都不太理想,Apache-poi读取数据量超过一定量的excel时会提示oom,jxl只支持解析.xls(97-2003)格式的文件。    在网上继续搜索相关的问题,但是都没办法解决。使用Apache-poi读取数据时分为用户模式和SAX事件驱动模式,但是看到示例基本都是SpringBoot的项目,在Android项目上使用会出现很多意料之外的问题,个人能力有限,不知道怎么解决。然后easyExcel和monitorjbl示例也是SpringBoot的项目,在android项目上使用也是面临着很多意料之外的问题。请问有什么方法能够做到在android项目上读取大量数据的excel
  • [使用指南] Android API网关 APIG下载demo后,调用接口报错
    将demo https://support.huaweicloud.com/devg-apig/apig-dev-180919068.html 下载下来,运行后请求接口报错
  • [问题求助] Android SDK 引入后跟原项目工程冲突导致编译失败
    照着官网的示例implementation 'com.huaweicloud:esdk-obs-android:3.21.12'结果编译后,产生错误信息java.lang.IllegalArgumentException     at org.objectweb.asm.ClassReader.<init>(Unknown Source)     at org.objectweb.asm.ClassReader.<init>(Unknown Source)     at org.objectweb.asm.ClassReader.<init>(Unknown Source)     at com.android.builder.desugaring.DesugaringClassAnalyzer.analyze(DesugaringClassAnalyzer.java:142)     at com.android.builder.desugaring.DesugaringClassAnalyzer.analyzeJar(DesugaringClassAnalyzer.java:92)     at com.android.builder.desugaring.DesugaringClassAnalyzer.analyze(DesugaringClassAnalyzer.java:63)     at com.android.build.gradle.internal.transforms.DesugarIncrementalTransformHelper.lambda$getInitalGraphData$4(DesugarIncrementalTransformHelper.java:150)     at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)     at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)     at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)     at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)     at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) 尝试过多种方法,依旧无法解决。
  • [技术干货] 微信小程序填写用户头像和昵称实现方法
    开放能力调整公告总体来说就是通过按钮来授权获取用户基础信息的能力都没啦(wx.getUserProfile,wx.getUserInfo都不行了),都要使用新版本的 【头像昵称填写能力】啦。获取头像获取头像代码wxxl部分123<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">  <image class="avatar" src="{{avatarUrl}}"></image></button>js部分1234567891011Page({  data: {    avatarUrl: defaultAvatarUrl,  },  onChooseAvatar(e) {    const { avatarUrl } = e.detail  //获取图片临时路径    this.setData({      avatarUrl,    })  }})适配头像时需要注意的地方此时获取到的头像路径为本地路径,虽然可以在页面上显示,但是并不能直接入库使用,浏览器上是访问不到的。需要上传到我们自己的服务器,后面每次使用都从我们自己的服务器上取。 其实说白了就是之前头像文件我们都是从微信服务器获取的,现在需要去我们自己的服务器获取了。1234567891011121314wx.uploadFile({  url: '我们自己的服务器地址', //仅为示例,非真实的接口地址  filePath: '图片临时路径',  name: 'uploadFile',  //自定义name  success(res) {    console.log('res', res);   //经自己服务器存储后,将地址返回到客户端。  },  fail(err) {    console.log('err', err);  },  complete(cp) {    console.log(cp);  }})获取昵称获取头像代码,将input中的“type”属性设置为‘nickname’,同时对"name"属性设定值,点击提交按钮后根据设置的name值获取对应的value。123456789<form bindsubmit="getUserName"> <!--定义提交事件-->  <view class="cu-form-group">       <view class="title">昵称:</view>       <input placeholder="请输入昵称" type="nickname" name="nickname" maxlength="32"></input>   </view>   <view class="up-bt">       <button form-type="submit" role="button" aria-disabled="false" class="save-bt cu-btn block bg-blue margin-tb-sm lg">更新资料</button>     </view></form>js部分123getUserName(e) {  console.log(e.detail.value.nickname);  //用户输入或者选择的昵称},获取昵称需要注意的地方用户输入或者选择昵称时,会异步对用户输入的内容进行安全监测,若未通过安全监测,微信将清空用户输入的内容,建议开发者通过 form 中form-type 为submit 的button 组件收集用户输入的内容。转载自https://www.jb51.net/article/274818.htm
  • [问题求助] QT5.12.6下使用FFMPEG 4.4.2-Android 出现不同手机无法兼容h264硬件解码的问题
    在Ubuntu18下成功编译了ffmpeg442-Android,尝试在qt中使用硬件解码。qt的环境如下:qt版本:5.12.6qt编译器:Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a整个硬件解码的代码如下: //1. 根据名称查找解码器的类型 type = av_hwdevice_find_type_by_name(m_HardwareName.data()); if (type == AV_HWDEVICE_TYPE_NONE) { qDebug()<<"未找到解码器的类型:"<<m_HardwareName; fprintf(stderr, "Device type %s is not supported.\n",m_HardwareName.data()); fprintf(stderr, "可用设备类型:"); while((type = av_hwdevice_iterate_types(type)) != AV_HWDEVICE_TYPE_NONE) fprintf(stderr, " %s", av_hwdevice_get_type_name(type)); fprintf(stderr, "\n"); return -1; } qDebug()<<"已经找到解码器:"<<m_HardwareName<<"其枚举值:"<<type; //2. 打开多媒体流,并且获取一些信息 if (avformat_open_input(&input_ctx,m_MediaFile.data(), NULL, NULL) != 0) { qDebug()<<"无法打开输入文件:"<<m_MediaFile; return -1; } //3. 读取媒体文件的数据包以获取流信息 qDebug()<<"读取媒体文件的数据包以获取流信息"; if (avformat_find_stream_info(input_ctx, NULL) < 0) { qDebug()<<"找不到输入流信息:"<<m_MediaFile; return -1; } qDebug()<<"查找视频流信息"; /* 查找视频流信息*/ ret = av_find_best_stream(input_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &decoder, 0); if (ret < 0) { qDebug()<<"在输入文件中找不到视频流"; return -1; } video_stream = ret; for (i = 0;; i++) { const AVCodecHWConfig *config = avcodec_get_hw_config(decoder, i); if (!config) { qDebug("Decoder %s does not support device type %s.\n", decoder->name, av_hwdevice_get_type_name(type)); return -1; } if (config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && config->device_type == type) { hw_pix_fmt = config->pix_fmt; break; } } 代码执行到这边的时候,便会出现如下报错:测试发现小米的手机可以正常通过此处代码,而联想、华为无法通过。怀疑是ffmpeg的代码流程及对应不同手机的适配有问题
  • [问题求助] QT 5.12.6 下调用FFMPEG android 4.2.2 出现“Decoder h264 does not support device type mediacodec”的问题
    已经成功编译了 FFMPEG-ANDRIOD 4.2.2,编译的选项如下:#!/bin/bashexport NDK=/home/sqm/ndk/android-ndk-r20b  #NDK的路径TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64function build_android{./configure \--prefix=$PREFIX \--enable-neon \--enable-shared \--enable-gpl \--enable-hwaccels \--enable-runtime-cpudetect \--enable-postproc \--enable-small \--enable-jni \--enable-mediacodec \--enable-decoder=h264_mediacodec \--enable-decoder=hevc_mediacodec \--enable-decoder=mpeg4_mediacodec \--enable-hwaccel=h264_mediacodec \--enable-static \--enable-pic \--enable-avdevice \--disable-doc \--disable-debug  \--enable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-symver \--cross-prefix=$CROSS_PREFIX \--target-os=android \--arch=$ARCH \--cpu=$CPU \--cc=$CC \--cxx=$CXX \--enable-cross-compile \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \--extra-ldflags="$ADDI_LDFLAGS"make cleanmake -j8make installecho "============================ build android $CPU success =========================="}#arm64-v8aARCH=arm64CPU=armv8-aAPI=21CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clangCXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysrootCROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-PREFIX=$(pwd)/android/$CPUOPTIMIZE_CFLAGS="-march=$CPU"build_android#armv7-aARCH=armCPU=armv7-aAPI=21CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clangCXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysrootCROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-PREFIX=$(pwd)/android/$CPUOPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "build_androidQT 的.pro文件中引用如下:整个工程编译正常,但是一旦调试、打开视频流,就会报如下错误:代码中是在如下地方出现问题:
  • [问题求助] QT5.12.6下调用FFMPEG 4.4.2 andriod 缺少相关库的问题
    qmake中进行如下声明:#指定库文件的路径LIBS += -L$$PWD/ffmepg422_android/arm64/lib -lavcodecLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lavfilterLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lavdeviceLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lavutilLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lavformatLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lpostprocLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lswscaleLIBS += -L$$PWD/ffmepg422_android/arm64/lib -lswresample#指定头文件的路径INCLUDEPATH+=$$PWD/ffmepg422_android/arm64/includecontains(ANDROID_TARGET_ARCH,arm64-v8a) { ANDROID_EXTRA_LIBS = \ $$PWD/ffmepg422_android/arm64/lib/libswscale.so \ $$PWD/ffmepg422_android/arm64/lib/libswresample.so \ $$PWD/ffmepg422_android/arm64/lib/libpostproc.so \ $$PWD/ffmepg422_android/arm64/lib/libclang_rt.ubsan_standalone-aarch64-android.so \ $$PWD/ffmepg422_android/arm64/lib/libavutil.so \ $$PWD/ffmepg422_android/arm64/lib/libavformat.so \ $$PWD/ffmepg422_android/arm64/lib/libavfilter.so \ $$PWD/ffmepg422_android/arm64/lib/libavdevice.so \ $$PWD/ffmepg422_android/arm64/lib/libavcodec.so ANDROID_PACKAGE_SOURCE_DIR = \ $$PWD/android}DISTFILES += \ android/AndroidManifest.xml \ android/build.gradle \ android/gradle/wrapper/gradle-wrapper.jar \ android/gradle/wrapper/gradle-wrapper.properties \ android/gradlew \ android/gradlew.bat \ android/res/values/libs.xml使用Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a对工程进行编译,出现如下报错:
  • [问题求助] 白名单授权咋样申请
    应用安装后默认加入白名单, 白名单授权咋样申请