android开发学习积累(四)

电话号码:

国际号码区号选择控件:CountryCodePicker  

电话格式验证(国际号码): libphonenumber

 

颜色渐变:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:angle="90"
        android:endColor="@color/colorPrimary"
        android:startColor="@color/colorAccent" />
</shape>

[gradient] 声明该shape的属性-渐变色,除此外还有其他属性如corners、stroke、size等等 
[android:angle]渐变色的角度,举例来说,0代表从上至下颜色渐变;45代表从左至右颜色渐变;90代表从下至上颜色渐变… 
[android:startColor&android:endColor] 渐变开始的颜色和渐变结束时的颜色

 

 

Android沉浸式状态栏实现:

https://juejin.im/post/5989ded56fb9a03c3b6c8bde

 

 

android沉浸式状态栏蒙灰:

在setContentView()之前添加代码:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //去除半透明状态栏

 

谷歌搜索:

在搜索内容后加 “ -关键词 ” 可以屏蔽相关的信息 例如 “love -YouTube” 就可以过滤掉来着YouTube的信息,这点可以在我们使用url拼接时起到过滤的作用,可用于爬数据

 

 

Android版本bug 8.0:

Android8.0不能同时把activity设置为强制竖屏和沉浸式,会导致闪退崩溃。

既不能在AndroidManifest同时设置

android:screenOrientation="portrait"
android:theme="@style/translucent"

  <style name="translucent" parent="AppTheme">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

 

 

弹窗第三方:

可以简单实现对弹窗位置的控制,点击事件,蒙层等。

https://github.com/razerdp/BasePopup

 

解析视频网站:

https://9xbuddy.com/

可以利用webview代码调用其,实现对多个网站视频来源的解析

示例代码:

 class InnerJSInterface {
        @JavascriptInterface
        public void parseSource(String source, String checkUrl, boolean second) {
      //视频的来源url      
List<String> list = new ArrayList();
            try {
                Document document = Jsoup.parse("<!DOCTYPE html><html lang=\"en\">" + source + "</html>");
                boolean match = false;
                for (Element element : document.getElementsByTag("div")) {
                    if (element.classNames().contains("night-white") && element.classNames().contains("items-center") && element.classNames().contains("px-3")) {
                        for (Element child : element.getElementsByTag("div")) {
                            if (child.text().equalsIgnoreCase("mp4") && child.classNames().contains("w-24")) {
                                match = true;
                            }
                        }
                        if (!match) {
                            continue;
                        }
                        for (Element child : element.getElementsByTag("div")) {
                            if (child.classNames().contains("w-full") && child.classNames().contains("mt-6")) {
                                String url = child.getElementsByTag("a").get(0).attr("href");
                                list.add(url);
                            }
                        }
                    }
                }
            } catch (Exception e) {

            }
        }
    }






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



  private void query9xbuddy(String webUrl) {
        WebView parseWebView = new WebView(this);
        WebSettings settings = parseWebView.getSettings();
        String userAgent = settings.getUserAgentString();
        parseWebView.addJavascriptInterface(new InnerJSInterface(), "localInterface");
        settings.setJavaScriptEnabled(true);
        settings.setBlockNetworkImage(true);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        parseWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return true;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }


            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        });
        parseWebView.setWebChromeClient(new WebChromeClient() {
            boolean isOnec = true;

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress >= 99 && ("https://9xbuddy.com/process?url=" + webUrl).equals(view.getOriginalUrl())) {
                    if (isOnec) {
                        view.evaluateJavascript("javascript:window.localInterface.parseSource("
                                + "document.getElementsByTagName('html')[0].innerHTML,'" + webUrl + "',false);", null);
                    }
                    isOnec = false;
                 
                }
            }
        });
        parseWebView.loadUrl("https://9xbuddy.com/process?url=" + webUrl);
    }

 

 

  • 反编译apk

https://github.com/ufologist/onekey-decompile-apk

 

  • 方法数超过限制

implementation 'com.android.support:multidex:1.0.3'

 

  • 消息通知适配 

https://segmentfault.com/a/1190000017186150

 

 

  • 导入新的第三方库,或升级原有的库的版本时出错

可以试试把Android库升级到AndroidX,因为很多新的库或版本是依赖AndroidX进行开发的,在studio中可以一键升级,也建议都用AndroidX进行开发,毕竟谷歌做了很多的优化升级。 

在顶部工具栏: Refactor中找到 Migrate to AndroidX  (如果没有,可以升级studio的版本)

 

  • ScrollView嵌套RecyclerView

 https://www.jianshu.com/p/5ba68d088c60

 

  • 实现冷热启动指定先打开某一个页面,例如广告页面,加载页面等

https://www.jianshu.com/p/6482b89fe506

android:launchMode="singleTask"
 <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

可以通过对要求页面设置这些属性来实现 

 

  • 杀死自己应用的进程

android.os.Process.killProcess(android.os.Process.myPid());

 

  • 获取当前屏幕是熄屏还是显示(View的display的state方法)

mBottom.getDisplay().getState()

 

  • 获取当前APP的系统位置

高版本的安卓不允许在自己应用以外的位置创建新文件,所以需要在该目录下进行文件读写,不然创建文件时会一直返回false

MApp.getInstance().getApplicationContext().getFilesDir().getAbsolutePath()

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值