精华内容
下载资源
问答
  • 安卓Q版本兼容性适配指导
  • 安卓Q暗黑模式适配

    千次阅读 2019-05-20 10:46:44
    安卓Q版本新增了暗黑模式,用户只需在系统中开启暗黑模式(MIUI中叫做深色模式),即可开启全局暗黑模式,这个也需要第三方应用来进行适配 暗黑模式:本质上就是两套主题的切换,从明亮的主题切换暗色主题的一个...

    安卓Q版本新增了暗黑模式,用户只需在系统中开启暗黑模式(MIUI中叫做深色模式),即可开启全局暗黑模式,这个也需要第三方应用来进行适配

    暗黑模式:本质上就是两套主题的切换,从明亮的主题切换暗色主题的一个过程,网上有很多成熟的第三方主题切换框架可以使用,不过我们这里讲的是利用安卓系统自带的API进行切换

    先上两张效果图吧:

    明亮模式
    明亮模式

     

    暗黑模式
    暗黑模式

    下面是适配步骤:

    1、颜色定义:

    首先在res/values/attr.xml 文件下定义控件的属性值,这里以颜色为例:

    <attr name="tool_main_color" format="color" />
    <attr name="tool_main_text_color" format="color"/>
    <attr name="tool_second_text_color" format="color"/>
    <attr name="tool_theme_text_color" format="color"/>
    <attr name="tool_divider_color" format="color"/>
    <attr name="tool_main_bg_color" format="color"/>
    <attr name="tool_edit_bg_color" format="color"/>
    <attr name="tool_btn_pressed_color" format="color"/>

    2、主题定义:

    res/values/style.xml 文件中定义明亮模式的主题和暗色模式的主题:

    明亮模式:

    <style name="tool_lite_class" parent="Theme.AppCompat.DayNight.DarkActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="tool_main_color">@color/color_green</item>
        <item name="tool_main_text_color">@color/color_black</item>
        <item name="tool_second_text_color">@color/color_black_30</item>
        <item name="tool_theme_text_color">@color/color_green</item>
        <item name="tool_divider_color">@color/color_green</item>
        <item name="tool_edit_bg_color">@color/color_white</item>
        <item name="tool_main_bg_color">@color/color_white</item>
        <item name="tool_btn_pressed_color">@color/color_white_d9</item>
        <item name="colorPrimary">@color/color_green</item>
        <item name="colorPrimaryDark">@color/color_green</item>
        <item name="colorAccent">@color/color_green</item>
        <item name="android:listDivider">@color/color_green</item>
    </style>

    暗色模式:

    <style name="tool_lite_dark" parent="Theme.AppCompat.DayNight.DarkActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="tool_main_color">@color/color_black</item>
        <item name="tool_main_text_color">@color/color_white</item>
        <item name="tool_second_text_color">@color/color_white_60</item>
        <item name="tool_theme_text_color">@color/color_gray</item>
        <item name="tool_edit_bg_color">@color/color_black_39</item>
        <item name="tool_divider_color">@color/color_black</item>
        <item name="tool_main_bg_color">@color/color_black_30</item>
        <item name="tool_btn_pressed_color">@color/color_gray</item>
        <item name="colorPrimary">@color/color_gray</item>
        <item name="colorPrimaryDark">@color/color_gray</item>
        <item name="colorAccent">@color/color_gray</item>
        <item name="android:listDivider">@color/color_gray</item>
    </style>

    注意:主题一定要继承自 Theme.AppCompat.DayNight.DarkActionBar 或者 Theme.AppCompat.DayNight ,不同模式下的属性要保持一致,属性值根据不同主题单独设置即可

    3、资源引用:

    在布局中利用 ?attr/tool_main_color 来引用你所定义的颜色值

    <TextView
        android:id="@+id/view_status_bar"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="?attr/tool_main_color" />

    4、AndroidManifest修改:

    在activity的的清单文件中添加以下属性android:configChanges="uiMode"

    举例:

    <activity
        android:name=".module.decibel.DecibelActivity"
        android:configChanges="uiMode" />

    5、在activity中设置主题:

    当activity初始化时,在setContentView(R.layout.activity_base)

    之前先一步设置通过setTheme(R.style.tool_lite_dark)来设置主题样式,

    注意:setTheme()一定要在setContentView()之前调用,否则主题设置无法生效

    6、检查当前系统是否已开启暗黑模式:

    fun getDarkModeStatus(context: Context): Boolean {
        val mode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
        return mode == Configuration.UI_MODE_NIGHT_YES
    }

    7、监听系统暗黑主题开启与关闭

    在activity中重写onConfigurationChanged()方法,代码如下:

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        when (newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_YES -> {
            // 暗黑模式已开启
        }
        Configuration.UI_MODE_NIGHT_NO -> {
            // 暗黑模式已关闭
        }
    	}
    }

    我的办法是通过recreate()重建界面来达到切换主题的,当然你也可以通过其他方式实现

    项目地址:https://github.com/konstant2016/konstantTool/,欢迎 start

     

    展开全文
  • 安卓Q上手

    2019-03-14 19:00:13
    谷歌发布了最新的安卓10版本,(也就是安卓Q)各个pixel亲儿子已经全部跟进更新了,包括pixel一代,我手上没有亲儿子系列,所以手上一台zuk z2来尝试最新的安卓Q,总的来说,UI方面与安卓P并没有太大差距(本人体验...

    谷歌发布了最新的安卓10版本,(也就是安卓Q)各个pixel亲儿子已经全部跟进更新了,包括pixel一代,我手上没有亲儿子系列,所以手上一台zuk z2来尝试最新的安卓Q,总的来说,UI方面与安卓P并没有太大差距(本人体验暂无UI差距),最大的更新在系统底层,估记到时候会被国内阉割不少。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Q版本 安卓手机录制系统声音

    千次阅读 2019-08-25 18:45:26
    Android Q 包含一个新的 AudioPlaybackCapture API。应用可以借助此 API 复制其他应用正在播放的音频。该功能类似于屏幕采集,但针对的是音频。主要用例是影音在线播放应用,这些应用希望捕获游戏当前播放的音频。 ...

    Android Q 包含一个新的 AudioPlaybackCapture API。应用可以借助此 API 复制其他应用正在播放的音频。该功能类似于屏幕采集,但针对的是音频。主要用例是影音在线播放应用,这些应用希望捕获游戏当前播放的音频。

    请注意,对于其音频正在由其他应用捕获的应用,Capture API 不会影响此应用的延迟时间。

     

    谷歌早在 Android 5.0,开放了视频录制的接口,其实严格来说,是屏幕采集的接口,也就是 MediaProjection 和 MediaProjectionManager。现在姗姗来迟的是系统视频捕获的姊妹接口,音频捕获;有了这个接口,可以实现系统音、系统播放视频的捕获。

    mProjectionManager = getSystemService(MediaProjectionManager.class);

    Intent screenCaptureIntent = mProjectionManager.createCcreenCaptureIntent();

    startActivityForResult(screenCaptureIntent,1);

    --开启谷歌授权弹框,这个与历史视频录制 的api是一样的,都是谷歌弹框提示用户,要截取音视频信息了,弹框风格主题都改不了,主要是为了隐私保护,防止钓鱼应用获取到隐私音视频

    protected void onActivityReslut(int requestCode, int resultCode, Intent intent){

        surper.onActivityReslut(requestCode, resultCode, intent);

        MediaProjection mediaProjection = mProjectionManager.getMediaProjection(resultCode, intent);

        AudioPlaybackCaptureConfiguration.Builder builder = new AudioPlaybackCaptureConfiguration.Builder(mediaProjection);

        builder.addMatchingUsage(AudioAttributes.USAGE_MEDIA);//多媒体

        builder.addMatchingUsage(AudioAttributes.USAGE_ALARM);//闹铃

        builder.addMatchingUsage(AudioAttributes.USAGE_GAME);//游戏

        ...

        audioPlaybackCaptureConfiguration = builder.build();

    --用户点击谷歌弹框,获取了权限,再onActivityResult中处理返回结果,返回的 intent生成audioPlaybackCaptureConfiguration,通过addMatchingUsage添加不同类型的系统声音源,需要录制什么声音源就添加什么类型

    AudioRecord.Builder recorder1 = new AudioRecord.Builder()

                                                         .setAudioFormat(new AudioFormat.Builder())

                                                         .setEncoding(AudioFormat.EMCODING_PCM_16BIT)

                                                         .setSampleRate(48000)  //采样率

                                                         .setChannelMask(AudioFormat.CHANNEL_IN_MONO)

                                                         .setBufferSizeInBytes(minBufferSize)

                                                         .setAudioPlaybackCaptureConfig(audioPlaybackCaptureConfiguration);

    mAudioRecorder = recorder.build();

    mAudioRecorder.startRecording();

    --生成音频对象,开启录制音频

    (代码纯手敲,可能有错误,主要看逻辑)

    API新提供的系统音录制接口存在的问题:

    1、AudioPlaybackCaptureConfiguration接口是谷歌API29新增的,要使用此接口,应用至少需要将compileSdkVersion升到API29。

    2、使用此api后,也不是全部音频都可以录制到,应用的音频能否被捕获也取决于应用的targetSdkVersion,默认情况下,以Android9.0及之前版本为目标平台的应用不允许捕获播放的音频。要启用捕获播放的音频功能,需要在应用的manifest.xml文件中包含android:allowAudioPlaybackCapture = “ture”。

    3、默认情况下,以android Q或更高版本为目标平台的应用允许其他应用捕获其音频。要禁止被捕获音频,需要在应用的manifest.xml文件中包含android:allowAudioPlaybackCapture = “false”。

    4、系统音录制其实早有接口。REMOTE_SUBMIX可以实现类似功能,但由于此接口不是专门为录制系统音频而开的所以存在缺陷,此接口在捕获多媒体音频时,外放无声音,而部分音频种类如闹钟等截取不到。具体见历史博客:https://blog.csdn.net/zhangzhuo1024/article/details/78484053,新接口感觉很鸡肋,处于安全隐私和高清音频的版权考虑,谷歌把系统音接口可录制的的范围设置了太多限制,用起来还感觉还不如历史REMOTE_SUBMIX接口。但是REMOTE_SUBMIX可以无限制录制高清无损音频,存在版权侵权风险,谷歌法务部已经就版权问题与我司反馈,整改是大趋势,使用新接口已经迫在眉睫。。。

     

    展开全文
  • 安卓Q适配指南-相册

    2020-03-30 22:52:43
    碎碎念 本来每次安卓版本升级都是非常期待的事情,但是开发者就吃苦了!!! 尤其是从Q开始,应用采用沙盒模式,即各种公共文件的访问都会受到限制。...直到我看到oppo开发者平台的开发指南:AndroidQ版本应用兼...

    碎碎念

    本来每次安卓版本升级都是非常期待的事情,但是开发者就吃苦了!!!

    尤其是从Q开始,应用采用沙盒模式,即各种公共文件的访问都会受到限制。。。

    所以适配Q成了当务之急,然鹅网上关于适配的资料少之又少(可能是我太菜了)

    主要出现的问题:

    根据图片的绝对路径无法正常加载图片,同时使用File.delete删除也是失效

    直到我看到oppo开发者平台的开发指南:Android Q版本应用兼容性适配指导,才解决了这个问题!

    特此记录一下。

    权限申请(都是权限惹的祸)

    安卓6.0以上动态申请权限,这里就写简单一点:

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    动态申请:

     private void checkPermission() {
            int readExternalStoragePermissionResult = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
            if(readExternalStoragePermissionResult != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
            }
        }

    遍历图片

    这里仍然使用ContentProvider来进行图片的获取。

    首先我们要确定我们需要的内容,大概是图片路径、图片显示名称、图片ID、图片创建时间。

    创建相应的Bean类:

    public class PhotoBean {
        private String path;
        private String name;
        private int ID;
        private long createDate;
    
    
        public int getID() {
            return ID;
        }
    
        public void setID(int ID) {
            this.ID = ID;
        }
    
        public String getPath() {
            return path;
        }
    
        public void setPath(String path) {
            this.path = path;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public long getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(long createDate) {
            this.createDate = createDate;
        }
    
    }

    遍历图片:

     private List<PhotoBean> mPics = new ArrayList<>();
    
    private void initData(){
            mPics.clear();
            ContentResolver contentResolver = getContentResolver();
            Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            Cursor query = contentResolver.query(uri,new String[]{
                    MediaStore.Images.Media.DATA,
                    MediaStore.Images.Media.DISPLAY_NAME,
                    MediaStore.Images.Media.DATE_ADDED,
                    MediaStore.Images.Media._ID},null,null,null,null);
            while(query.moveToNext()) {
                PhotoBean photoItem = new PhotoBean();
                photoItem.setPath(query.getString(0));
                //这里的下标跟上面的query第一个参数对应,时间是第2个,所以下标为1
                photoItem.setCreateDate(query.getLong(1));
                photoItem.setName(query.getString(2));
                photoItem.setID(query.getInt(query.getColumnIndex(MediaStore.MediaColumns._ID)));
                mPics.add(photoItem);
            }
            query.close();
        }

    这样我们就取到了相册所有图片的信息,主要是查到这个ID

    此时我们如果直接使用path来创建Bitmap去加载或者File、第三方框架均不能正确加载图片。

    下面讲一下如何使用Uri来加载图片

    获取Uri并加载图片

    我们可以在PhotoBean中增加这个方法

     public Uri getUri(){
            Uri baseUri = Uri.parse("content://media/external/images/media");
            return Uri.withAppendedPath(baseUri, "" + ID);
        }

    如果没有获取ID,只有photpath也是可以的,但影响效率:需要根据path再去查一遍

    public static Uri getImageContentUri(Context context, String path) {
            Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
                    new String[] { path }, null);
            if (cursor != null && cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
                Uri baseUri = Uri.parse("content://media/external/images/media");
                return Uri.withAppendedPath(baseUri, "" + id);
            } else {
                if (new File(path).exists()) {
                    ContentValues values = new ContentValues();
                    values.put(MediaStore.Images.Media.DATA, path);
                    return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                } else {
                    return null;
                }
            }
        }

    使用第三方控件如Glide加载

    拿到Uri以后就可以直接使用

     Glide.with(context).load(photoBeanList.get(position).getUri()).into(imageView);

    这样就没有问题了。

    选择图片并拷贝到私有目录下进行加载

    那么,既然安卓Q针对应用私有数据不受任何限制,那么我们可以提前把用户选择的图片拷贝一份到自己的私有目录下,那么直接进行读取删除操作就不会受到限制了。

    选择一张图片:

    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, 2);

    在onActivityResult中接收

    if (data != null) {
      Uri originalUri = data.getData(); // 获得图片的uri
      String path= ImageHelper.getPrivatePath(SettingActivity.this,originalUri);
      if(path!=null&&!path.equals("")){
        //TODO
      }
    }

    getPrivatePath的操作就是将文件拷贝一份到私有目录下并返回绝对路径

    /**
         * 根据Uri直接获取图片
         * @param context 上下文
         * @param uri 图片的uri
         * */
        public static String getPrivatePath(Context context,Uri uri){
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
                File file=compressImage(context,bitmap);
                return file.getAbsolutePath();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "";
        }

    compress是精简的意思,不知道我怎么想的就写成了这个,自己注意一下

     /**
         * 把bitmap写入app私有目录下
         * @param context 上下文
         * @param bitmap 这个bitmap不能为null
         * @return File
         * 适配到4.4
         * */
        private static File compressImage(Context context, Bitmap bitmap) {
            String filename;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
                Date date = new Date(System.currentTimeMillis());
                //图片名
                filename = format.format(date);
            }else {
                Date date=new Date();
                filename=date.getYear()+date.getMonth()+date.getDate()+date.getHours()+date.getMinutes()+date.getSeconds()+"";
            }
    
            final File[] dirs = context.getExternalFilesDirs("Documents");
            File primaryDir = null;
            if (dirs != null && dirs.length > 0) {
                primaryDir = dirs[0];
            }
            File file = new File(primaryDir.getAbsolutePath(), filename + ".png");
            try {
                FileOutputStream fos = new FileOutputStream(file);
                try {
                    fos.write(baos.toByteArray());
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
    
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
    
                e.printStackTrace();
            }
    
            // recycleBitmap(bitmap);
            return file;
        }

    后面如果正常使用的话就是直接用path加载即可。

    /**
         * 根据私有路径加载
         * @param context 上下文
         * @param path 这个路径一定是私有路径,即应用自己的目录下(data/包名)
         * @return Drawable 用来设置背景什么的
         * */
        public static Drawable getByPrivatePath(Context context,String path){
            Bitmap bitmap = BitmapFactory.decodeFile(path);
            Drawable drawable = new BitmapDrawable(context.getResources(), bitmap);
            return drawable;
        }

    图片删除操作

    以前我们在删除的时候,需要开发者自己添加一个确认删除的功能,现在谷歌已经帮我们完成了。

    File.delete也就失效了,相对来说比较安全吧。

    同样的,我们需要使用Uri来进行操作。

    @TargetApi(29)
        public void deleteUri(Uri imageUri) {
            ContentResolver resolver = getContentResolver();
            OutputStream os = null;
            try {
                if (imageUri != null) {
                   resolver.delete(imageUri,null,null);
                }
            } catch (RecoverableSecurityException e1) {
                Log.d(TAG,"get RecoverableSecurityException");
                try {
                    this.startIntentSenderForResult(
                            e1.getUserAction().getActionIntent().getIntentSender(),
                            100, null, 0, 0, 0);
                } catch (IntentSender.SendIntentException e2) {
                    Log.d(TAG,"startIntentSender fail");
                }
            }
        }

    RecoverableSecurityException在谷歌文档中是这样解释的:This exception is only appropriate where there is a concrete action the user can take to recover and make forward progress, such as confirming or entering authentication credentials, or granting access.即对于图片的修改、删除操作都需要用户的允许,即也是一种权限,故需要抛出该异常并去申请获得该权限。

    如图所示:

     

    总结

    图片在加载的过程中,有一些图片能用uri查到,但是通过uri获取图片抛出文件不存在异常,故完善一下代码。

    这里提供的解决思路是将选择的图片拷贝一份到私有目录,这样无论是读取还是修改图片都不会受到影响。

    public class ImageHelper {
        /**
         * 通过绝对路径获取图片的私有存储路径
         * 将图片复制到私有目录下,下次加载、删除啥的就没有影响了
         * 但是注意删除的仅是app私有的数据,并不是真正删除相册的图片
         * 存在部分图片能查到uri但是无法正常加载,故需要判断一下
         * 如果返回路径为空,则跳过该图片,并提示用户手动在系统相册中将图片添加至相册再重试
         * @param context 上下文
         * @param path 图片绝对路径(直接获取到的)
         * @return String 返回一个复制到私有路径下相同的图片路径
         * */
        public static String coverFromBitmap(Context context, String path){
            Bitmap bitmap=SuperSuitWay(context,path);
            if(bitmap==null){
                return "";
            }
            return compressImage(context,bitmap).getAbsolutePath();
        }
    
        /**
         * 把bitmap写入app私有目录下
         * @param context 上下文
         * @param bitmap 这个bitmap不能为null
         * @return File
         * */
        private static File compressImage(Context context,Bitmap bitmap) {
            String filename;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
            Date date = new Date(System.currentTimeMillis());
            //图片名
            filename = format.format(date);
            final File[] dirs = context.getExternalFilesDirs("Documents");
            File primaryDir = null;
            if (dirs != null && dirs.length > 0) {
                primaryDir = dirs[0];
            }
            File file = new File(primaryDir.getAbsolutePath(), filename + ".png");
            try {
                FileOutputStream fos = new FileOutputStream(file);
                try {
                    fos.write(baos.toByteArray());
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
    
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
    
                e.printStackTrace();
            }
    
            // recycleBitmap(bitmap);
            return file;
        }
        /**
         * 通过绝对路径获取bitmap
         * 适配安卓Q使用绝对路径无法正确加载的问题
         * @param context 上下文
         * @param path 绝对路径
         * @return Bitmap
         * */
        private static Bitmap SuperSuitWay(Context context,String path){
            Uri external = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
                    new String[] { path }, null);
            Uri imageUri = null;
            if (cursor != null && cursor.moveToFirst()) {
                imageUri = ContentUris.withAppendedId(external, cursor.getLong(0));
                cursor.close();
            }
            ParcelFileDescriptor pfd = null;
            if (imageUri != null) {
                try {
                    pfd = context.getContentResolver().openFileDescriptor(imageUri, "r");
                    if (pfd != null) {
                        Bitmap bitmap = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
                        return bitmap;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (pfd != null) {
                            pfd.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
    
    }

     

    ---------------------------------------------------------------------------------------------------------------------

    啊,自己好菜_(¦3」∠)_

    觉得文章好的欢迎点赞哦~

    这里推荐一篇文章,也是最近我找到的,拜读一下:点我跳转

     

    展开全文
  • = Build.VERSION_CODES.Q){ //>=安卓10的逻辑部分 } API 版本版本名称 英文名称 19 4.4 KITKAT 20 4.4 KITKAT_WATCH 21 5.0 LOLLIPOP 22 5.1 LOLLIPOP_MR1 23 6.0 M 24 7.0 N 25 7.1 N
  • 小老鼠安卓Q v1.04b 免费版更新: 1、更新了部分协议。 2、修复了导出各类号码的功能。 3、手动验证码更为流畅。 4、加入掉线自动重登功能。 5、挂机数量限制从500个号码提升到1000。 6、修复了其它一些已知...
  • 本文讲述在安卓高版本例如安卓Q中 快速调用系统相机或相册进行图片操作的过程 需要用到的库:https://github.com/songlongGithub/uTakePhoto,欢迎大家给原作者一个star 在安卓高版本中,关于调用相机相册使用图片的...
  • MTK平台安卓R/Q版本上如何写一份i2c接口驱动 1.LK阶段: #define IML7525_BIAS_I2C_BUSNUM I2C3 //设备挂载在i2c3总线上 #define IML7525_SLAVE_ADDR_WRITE 0x3E //此处写七位地址即可,读写位会位移 static struct ...
  • 29Android 10.0 (Q) 28Android 9.0 (Pie) 27Android 8.1 (Oreo) 26Android 8.0 (Oreo) 25Android 7.1.1 (Nougat) 24Android 7.0 (Nougat) 23Android 6.0 (MarshMallow) 22Android 5.1 (Lollipop) 21Android ...
  • 使用axios对安卓版本兼容性处理

    千次阅读 2018-08-09 15:00:27
    参考文章 ... ... 整理实践 1. 发现问题,在安卓5.1系统上,使用axios加载的数据没有加载出来,经过调试发现aixos方法无效,  主要就是无法使用promise。加上以下polyfill就可以了 ...
  • 手机 篇一:小米9体验安卓Q(附教程)2019-05-10 16:38:2318点赞24收藏21评论故事是这样的:5月8日,谷歌I/O开发者大会正式开幕,全新的Android Q正式亮相。谷歌方面在大会上也分享了Android Q的更多细节,版本号为10...
  • 安卓bata Q使用感受

    2019-05-13 21:20:05
    前几天,google的io大会上面,发布了安卓今年下半年的操作系统版本安卓bata Q3,并且有多达十几款安卓手机都可以下载并尝试新版操作系统的公测版,我用的是google的pixel手机,今天更新了一下自己的安卓版本。...
  • 小米MIUI 10新版安卓q系统内测开启 支持机型小米97月11日晚,小米手机系统软件部总监张国全晒出了基于Android Q深度定制的MIUI 10截图(尝鲜机型是小米9)。张国全表示,Android Q MIUI版本已经开始内测,欢迎大家报...
  • 华为小米OV一加8余款机型率先适配安卓Q伴随着谷歌开发者大会的召开,安卓第10个版本Android Q正式发布,Android Q加入原生折叠屏支持;适用5G网络;加入原生夜间深色支持功能,可实现全局暗黑模式;屏幕录制;允许...
  • 适配安卓X版本时,发现很多权限申请后无法达到应有的效果。 例如:申请了内存的读写权限,但是还是无法创建父文件夹。 查阅了一下开发文档: getExternalStorageDirectory()-在API级别29中不推荐使用此方法。为了...
  • 原标题:小米9将正式更新安卓Q,适配...而是整合了miui系统的定制版本安卓Q还没有正式发布,就未雨绸缪进行内测招募,小米9有可能会成为第一批,正式更新安卓Q的机型。 MIUI 公布的小米旗下各机型安卓Q更新的时间...
  • 原标题:小米9迎来最后一个基于安卓9的系统,即将启动安卓q开发版内测近来小米9的开发版系统发布了在过渡到安卓q前的最终版本(9.7.22),论坛公告也当放出了即将启动内测的消息,这样一来,小米对于系统的更新适配...
  • 小米9和红米k20pro的用户现在已经陆续收到升级安卓Q的提醒了,作为今年最新发布的安卓系统,小米用户能第一时间升级尝鲜,说明小米的实力还是很强的,这次更新版本号为 MIUI 10 9.8.8内测版,这也是MIUI10跨安卓版本...
  • IT之家5月9日消息 昨天,在I/O大会上,谷歌介绍了Android 10 Q中面向消费者的新功能,这些功能将于夏末完成并发布给Pixel设备。现在,谷歌已经推出了该系统的第三个beta版本,并且支持13家制造商的不少于21款智能...
  • 废话不说,直接上镜像,可以试试,不一定完全适配(RK3399+RK808D,DDR3,EMMC。特别是IO脚,各厂家分配不一样) 链接:...提取码:amr6 如果有问题,或者成功了可Q254327173 ...
  • 上期我们针对Android Q 版本中对设备存储空间进行的限制、新特性变更引发的兼容性问题及原因分析推出了《安卓 Q | 8大场景全面解析应用存储沙箱化》文章,本期文章我们将手把手指导各位应用开发者如何针对以上特性...
  • Q Android 9 28 P Android 8.1 27 O_MR1 Android 8.0 26 O Android 7.1.1 Android 7.1 25 N_MR1 Android 7.0 24 N Android 6.0 23 M Android 5
  • 本文档为个人博客文档系统的备份版本、作者:小游、作者博客:点击访问 参考:https://stackoverflow.com/questions/9224056/android-bitmap-to-base64-string public static Bitmap convert(String base64Str) ...
  • 两周前,谷歌放出了 Pixel 系列专属的首个 Android Q Beta 版本,而在日前有消息显示,官方已经紧锣密鼓的推出了第二个测试版 Android Q Beta 2。而在发布会了全新的测试版之后,谷歌同时还公布了 Android Q 的 GSI...
  • 它会告诉用户哪个应用程序正在使用该权限,在Android Q中, 有网友...Android Q MIUI版本已经开始内测, 根据谷歌公布的信息,欢迎大家报问题,Android Q版MIUI 10界面风格与Android P版本区别不大。小米MIUI 10新...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 184
精华内容 73
关键字:

安卓q版本