
安卓知识
文章平均质量分 51
圣剑Jay
这个作者很懒,什么都没留下…
展开
-
Android APT
Android APT注解类型注解的处理运行时注解的处理编译时注解的处理javapoetAPT annotation processing tool 注解处理工具注解类型注解语法注解通过@interface关键字来定义@Retention(RetentionPolicy.CLASS)@Target({ElementType.FIELD, ElementType.TYPE})public @interface MyAnnotation {}Java中总共有5中元注解:@Retention转载 2021-07-25 15:58:00 · 1204 阅读 · 0 评论 -
android 实现返回键执行home键方法
手机返回键会销毁应用activity页面,再进入activity页面全部重新走生命周期,重新走代码流程。很多时候我们不一定想退到手机主页就销毁应用页面,仅仅想实现电脑端最小化应用程序的效果。实现返回键执行home键方法。public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent intent = new Intent(Intent.转载 2021-07-18 11:03:41 · 2551 阅读 · 0 评论 -
LinearLayout 获取子元素,并分别给子元素赋值实现
java类实现对LinearLayout 里面所有没有标明id的TextView进行赋值LinearLayout thisNoLayout = findViewById(R.id.ly_this_no);//因为父控件中写的是五个TextView,所有这里的getChildCount也是五个String resultArray=new String[]{"a","b","c","d","e"};for (int i = 0; i < thisNoLayout.getChildCoun转载 2021-04-29 21:49:57 · 559 阅读 · 0 评论 -
Android 高版本API方法在低版本系统上的兼容性处理
下面这段代码在5.0手机上崩溃了注意代码 @RequiresApi(api = Build.VERSION_CODES.M)@RequiresApi(api = Build.VERSION_CODES.M)private static boolean isIgnoringBatteryOptimizations(Context context) { boolean isIgnoring = false; PowerManager powerManager = (PowerManage转载 2021-04-23 23:30:17 · 2790 阅读 · 1 评论 -
Android 获取视频第一帧
1.本地视频MediaMetadataRetriever media = new MediaMetadataRetriever();media.setDataSource(videoPath);// videoPath 本地视频的路径Bitmap bitmap = media.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);ivAddPhoto.setImageBitmap(bitmap);2.网络视频//网络p转载 2021-04-16 21:29:18 · 1016 阅读 · 0 评论 -
Fragment和Activity的区别
Activity是系统的四大组件之一,由activityManager管理,生命周期由系统控制。Fragment是在3.0后引入的组件,由FragmentManager管理,可以由Activity自由控制,引入或者删除,更方便。由于Fragment是Activity管理,所以在使用的时候,要格外注意,创建之前需要getFragmentByTag或者ById查看一下是否已经有存在的,FragmentManager也跟ActivityManager一样有一个缓存机制。同一个TAG的fragment如果多次.转载 2021-04-16 20:21:09 · 670 阅读 · 0 评论 -
android.support.v4.app.Fragment和android.app.Fragment区别
Fragment(碎片)是在3.0以后才出现的,Google为了兼容3.0以前的版本,使用了android.support.v4来兼容以前的SDK。不同点如下1.最低支持版本不同android.app.Fragment 兼容的最低版本是android:minSdkVersion=“11” 即3.0版android.support.v4.app.Fragment 兼容的最低版本是android:minSdkVersion=“4” 即1.6版2.需要导jar包fragment android.supp转载 2021-04-16 20:13:48 · 2052 阅读 · 0 评论 -
解决启动Android应用程序时出现白屏或者黑屏的问题
一般情况下,启动页面通常是全屏的,而且会用一张图片来展示用户打开应用程序后第一眼看到的界面。在手机中点击应用程序的图标到应用程序显示完MainActivity的视图这个过程中,通常会用一到两秒的时间。在默认activity的主题下(Light or Black),这两秒屏幕就会出现白屏(Light)或者黑屏(Black)- 实际上是activity默认的主题中的android:windowBackground为白色或者黑色导致的。通过设置主题来防止白屏或者黑屏1.设置android:windowBac转载 2021-04-02 20:18:45 · 1637 阅读 · 0 评论 -
Android 8.0 崩溃问题记录:Only fullscreen opaque activities can request
记录一下最近App在Android 8.0 版本发生闪退的一个问题。Caused by: java.lang.IllegalStateException:Only fullscreen opaque activities can request orientation1.起因为了解决app启动页白屏或者黑屏,把启动页Activity设置为全透明的风格:<item name="android:windowIsTranslucent">true</item>于是,悲剧发转载 2021-04-02 20:10:01 · 595 阅读 · 0 评论 -
GlideApp无法生成问题解决
1、sdk build版本必须为>=27,必须保证所有的support 的版本为相同并且为27.1.0compile 'com.android.support:support-v4:27.1.0'compile 'com.android.support:recyclerview-v7:27.1.0'2、我用的是Glide版本是4.7.1implementation 'com.github.bumptech.glide:glide:4.7.1'annotationProcessor 'co转载 2021-03-28 22:24:35 · 823 阅读 · 0 评论 -
Android 从任何地方得到Application context
本篇文章介绍如何得到Application context。一般来说,我们有以下方法,1. 继承Application类我们知道,Application类是唯一的,我们可以继承该类,并将context保存在内部,然后在需要的时候,返回就可以了。代码如下,public class MyApplication extends Application { private static Context context; public void onCreate() { supe转载 2021-03-27 11:51:44 · 746 阅读 · 0 评论 -
Android中获取当前正在显示的Activity实例
Android开发中需要用到当前 activity实例,如何获取当前正在显示的Activity实例1.保存当前Activity实例import android.app.Activity;import java.lang.ref.WeakReference;public class MyActivityManager { private static MyActivityManag...原创 2019-09-15 10:39:37 · 11418 阅读 · 0 评论 -
记录一次androidx项目迁移
1.Android Studio提供了一个一键迁移的功能只需要对着你的项目名右击 → Refactor → Migrate to AndroidX,就会弹出如下图所示的窗口。这里点击Migrate,Android Studio就会自动检查你项目中所有使用Android Support Library的地方,并将它们全部改成AndroidX中对应的库。另外Android Studio还会将你原来的项目备份成一个zip文件,这样即使迁移之后的代码出现了问题你还可以随时还原回之前的代码。几乎没动代码就直原创 2021-03-14 14:29:40 · 453 阅读 · 0 评论 -
android 删除sqlite数据库
删除自己应用下的所有db数据库文件,代码如下:String[] arr = context.databaseList();for (int i = 0; i < arr.length; i++) { context.deleteDatabase(arr[i]);}具体api介绍根据创建的db数据库名称,删除db数据库文件android.content.Context.deleteDatabase(String name);/** * Delete an existing原创 2021-03-13 11:41:09 · 2488 阅读 · 0 评论 -
Android 实战JNI之“hello world”
通过CMake工具demo演示流CMake安装新建项目,选择Native C++项目在Android Studio 完成新项目的创建后,请从IDE左侧打开Project 矿口并选择Android 视图。如下图所示,Android Studio 将添加cpp和External Build Files 组:直接运行项目我们来直接 run一下这个项目,看下结果#include <jni.h>#include <string>extern "C" JNIEXPORT转载 2021-03-07 23:52:39 · 572 阅读 · 0 评论 -
android日志打印库com.orhanobut.logger.Logger
logger文件夹/logs_0.csv原创 2021-03-06 16:38:43 · 2988 阅读 · 0 评论 -
AndroidStudio获取SHA1
SHA1的获取方法SHA1分为发布版和开发版,便于开发者开发调试和最终上线使用。通过Android Studio获取通过Android Studio获取1.打开Android Studio,进入Terminal工具,如下图所示:2.输入命令行和密码,即可获取SHA1等信息;命令行:keytool -list -v -keystore ~/.android/debug.keystore...原创 2019-12-15 10:19:06 · 608 阅读 · 0 评论 -
安卓获取设备蓝牙连接状态
获取已绑定设备的蓝牙信息与连接状态(注:获取连接状态方法被隐藏,必须通过反射调用),以下为示例代码:package com.example.bluetoothtest;import androidx.appcompat.app.AppCompatActivity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.os.Bundle;import an转载 2021-03-03 20:47:14 · 2537 阅读 · 2 评论 -
android 第三方加固方案对比
腾讯乐固首选,阿里加固没毛用,360次选原本大小阿里聚安全腾讯云应用乐固360加固保梆梆加固爱加密16.6MB18.2MB17.3MB17MB18.4MB17.7MB 兼容性采用testin标准兼容测试,终端数100款通过率如下:原本阿里聚安全腾讯云应用乐固360加固保梆梆加固爱加密100%100%99%98%98%97%启动时间采用testin标准兼容测试,终端数100款原本阿里聚安全腾转载 2021-02-23 23:45:12 · 1878 阅读 · 0 评论 -
浅谈Android 混淆和加固
混淆:针对项目代码,代码混淆通常将代码中的各种元素(变量、函数、类名等)改为无意义的名字,使得阅读的人无法通过名称猜测其用途,增大反编译者的理解难度。虽然代码混淆可以提高反编译的门槛,但是对开发者本身也增大了调试除错的难度。开发人员通常需要保留原始未混淆代码用于调试。操作时机:项目打包时加固:针对apk,加固是多维度的安全防护方案,包括反破解、反逆向、防篡改等,可以防止应用被各类常见破解工具逆向,安全性要远大于单纯的代码混淆。操作时机:项目打包成的apk文件以上,混淆用于让apk被反编译后转载 2021-02-23 19:52:37 · 698 阅读 · 0 评论 -
Android 中判断 当前应用是 debug 还是release
判断当前应用是否是debug状态//判断当前应用是否是debug状态public static boolean isApkInDebug(Context context) { try { ApplicationInfo info = context.getApplicationInfo(); return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; } catch (Exception原创 2021-02-23 19:40:36 · 1039 阅读 · 0 评论 -
android 一个app中有多个activity读取NFC标签问题
最近在写有关NFC标签读取录入的android APP。由于在AndroidManifest.xml配置使得NFC可以自启动对应activity,但APP中好多activity都需要NFC标签进行读取,这时activity的启动就出现了问题。最初代码如下AndroidManifest中配置:<activity android:name=".ui.activity.xxxActActivity" android:configChanges="orientation|screenS转载 2021-01-30 00:05:13 · 1025 阅读 · 0 评论 -
Android 判断App运行在模拟器还是真机上的最终解决方案
最近公司搞了一波送福利的活动,被人用模拟器恶意刷注册量了.后来我经过研究和实测,得出以下方法,目前还没有发现有模拟器能突破这个检测,方法如下:方法使用:if(Android_ID_Utils.notHasBlueTooth() ||Android_ID_Utils.notHasLightSensorManager(this) ||Android_ID_Utils.isFeatures() ||Android_ID_Utils.checkIsNotRealPhone() ||Andro转载 2021-01-27 19:58:28 · 2195 阅读 · 0 评论 -
android studio怎么打开SQLite数据库
用android studio开发android的时候,会用到SQLite数据库,下面教大家如何打开SQLite数据库方法/步骤1、打开view菜单下面的Device File Explorer2、右侧找到data文件夹3、下面还有一个data文件夹4、找到你的项目的包名5、然后打开database文件夹,就看到SQLite数据库了如果没有这个文件夹,说明程序暂时还没创建数据库,所以没有db数据产生6、最后,我是不能直接拖动到工具打开,copy到某个盘位置“右键-save as”转载 2021-01-20 23:01:47 · 6559 阅读 · 0 评论 -
Android可能出现的SQL注入以及防范
Android可能出现的SQL注入以及防范 什么是SQL注入SQLite数据库的SQL注入如何防止SQL注入小结 什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 SQLite数据库...转载 2021-01-20 22:37:47 · 600 阅读 · 0 评论 -
java 根据时间相差显示时分秒
java 根据时间相差显示时分秒先将两个时间转换为毫秒相减,得到相差的毫秒数long number = date1.getTime()-date2.getTime();然后在将毫秒转换为date类型就可以了DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Calendar calendar = Calendar.getInstance();calendar.setTimeInMillis(number);Sy转载 2020-12-25 22:12:46 · 1871 阅读 · 0 评论 -
推荐一个 Android 图片压缩框架
Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。项目描述目前做App开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。于是自然想到App巨头“微信”会是怎么处理,Luban(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法。因为有其他语言也想要实现L转载 2020-12-05 18:21:32 · 460 阅读 · 0 评论 -
安卓应用禁止分屏模式方法
因为很多应用的自身问题,在分屏模式下会出现layout错乱的现象。所以有些应用是不支持分屏模式的。下面我们介绍三种禁止分屏模式的方法。由最简单实用,到稍微麻烦但一律秒杀的。方法一:我们会经常使用的,在AndroidManifest.xml文件中的application节点或者activity节点中添加如下:android:resizeableActivity="false"false表示不支持分屏模式,true表示支持分屏模式。方法二:我们可以在应用的Activity的onCreate()转载 2020-10-18 01:03:00 · 1598 阅读 · 0 评论 -
Android WebView 与JS的数据交互
1.Android调用JS代码的方法有2种通过WebView的loadUrl通过WebView的evaluateJavascriptjava 公共代码WebSettings webSettings = mWebView.getSettings();webSettings.setJavaScriptEnabled(true);// 设置与Js交互的权限webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 设置允许JS弹窗原创 2020-10-04 11:38:37 · 391 阅读 · 0 评论 -
Android 7.0 行为变更 通过FileProvider在应用间共享文件
Android 7.0 行为变更为了提高私有目录的安全性,防止应用信息的泄漏,从 Android 7.0 开始,应用私有目录的访问权限被做限制。具体表现为,开发人员不能够再简单地通过 file:// URI 访问其他应用的私有目录文件或者让其他应用访问自己的私有目录文件。替代解决方案便是使用 FileProvider。FileProvider作为四大组件之一的 ContentProvider,一直扮演着应用间共享资源的角色。这里我们要使用到的 FileProvider,就是 ContentProvi转载 2020-10-03 20:00:49 · 346 阅读 · 0 评论 -
Android 使用Glide 报You cannot start a load for a destroyed activity异常
Fatal Exception: java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134) at com.bumptech.glide.manager.Req原创 2020-10-02 00:35:38 · 457 阅读 · 0 评论 -
Glide-图片的剪裁(ScaleType)
前言:这一节里面我们将讲到关于Glide的图片的剪裁Glide 系列目录1.Glide-入门教程2.Glide-占位图以及加载动画3.Glide-加载本地图片4.Glide-加载Gif5.Glide-绑定生命周期6.Glide-内存缓存与磁盘缓存7.Glide-通过Modules定制Glide8.Glide-自定义缓存9.Glide-图片的压缩10.Glide-图片预处理(圆角,高斯模糊等)11.Glide-图片的剪裁(ScaleType)12.Glide-源码详解1.基转载 2020-10-01 23:30:51 · 1920 阅读 · 1 评论 -
Java:String、StringBuffer和StringBuilder的区别
1 StringString:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。/** The value is used for character storage. */private final char value[]; /** The offset is the first index of the storage that is used. */private final int offset; /** The count is the num转载 2020-10-01 15:16:39 · 153 阅读 · 0 评论 -
一种极低成本的Android屏幕适配方式(今日头条适配)
在Android开发中,由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来适配,但其在各种奇怪分辨率下表现却不尽如人意,因此下面探索一种简单且低侵入的适配方式。传统dp适配方式的缺点android中的dp在渲染前会将dp转为px,计算公式:px = density * dp;density = dpi / 160;px = dp * (dpi / 160);而dpi是根据屏幕真实的分辨率和尺转载 2020-06-25 16:52:10 · 379 阅读 · 0 评论