2018年10月18日 星期四

Android-使用API取得資料出現org.apache.http.ProtocolVersion

尚未整理

隨著資安意識抬頭
在網路連線的功能也需更加的強化
在最近開發的過程中
直接使用 SDK 28 版本
在開發的過程中竟然發生以下的錯誤

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;
at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:109)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:97)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:114)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" .......]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:109)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:97)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:114)
Suppressed: java.io.IOException: No original dex files found for dex location /data/app/.....split_lib_resources_apk.apk
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:354)











這看似已經存在的竟然找不到(張大眼睛
那如果直接跳過?

<uses-library
android:name="org.apache.http.legacy"
android:required="false" />

竟然又出現錯誤
java.io.IOException: Cleartext HTTP traffic to -.- not permitted







看起來有進展
但是看似不被允許

結果去官方找答案 : 網路安全性設定
原來是有關安全性的問題,解法 :
非常的不建議此方法
因為有可能連到您不知道的位址
結果遭受到攻擊

<application
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true">
<activity android:name=".LinePermissionActivity">
.
.
.
</application>













參考資料:Android 8: Cleartext HTTP traffic not permitted

2018年9月28日 星期五

Android-Android Console 隱私權政策

20190316 新增隱私權規章來源:
(部分收費) FreePrivacyPolicy 如果有GPS、adMob...就需要額外加錢
(免費) 簡易版本
(免費) termly
(免費) getterms
除了 FreePrivacyPolicy 有憑證連結其餘需自行找地方存放


這幾天收到 Google 通知信
如下:













簡單來說
辛辛苦苦做出來的應用程式暫時不會出現在商店了

問題是以下到底是?
違反 Android 廣告 ID 的使用方式政策和開發人員發佈協議第 4.8 條的規定

可能有的問題 :
1 . 有新的問券調查












2 . 那就和我一樣沒有設定隱私政策連結
(os : 目前不提交隱私權政策網址這選項是...?)
















請到此連結創立關於您應用軟體對應憑證( 免費版本皆可 ):privacypolicies












填完內容後回出現此,並且將並且將此路徑貼至隱私政策連結即可












請務必好好保留此資料


參考資料:Privacypolicies

2018年9月16日 星期日

Android-換頁特效

各位在開發頁面過程中
一定多多少少聽到換頁、轉頁這樣的抱怨

能有啥麼特效可以呈現 ?
這是什麼使用者體驗 ?
一堆讓人滿頭問號的 What...

今天就來寫簡單的範例讓大家秒懂
此篇以左右滑動特效為例子

公式圖表 :
















先想 A 頁面位移量為多少
再想 B 頁面位移量為多少



















1 . 先創立 res/anim folder













2 . 建立特效
A頁面主頁滑至左底<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />
</set>
B頁面右底滑至主頁
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:duration="500"
    android:fromXDelta="100%p"
    android:toXDelta="0%p" />
</set>

3 . 立即將此風格套用在 Style.xml 上吧
<style name="transitionPage" style="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/open_in_from_right</item>
<item name="android:activityOpenExitAnimation">@anim/open_out_from_left</item>
<item name="android:activityCloseEnterAnimation">@anim/close_in_from_left</item>
<item name="android:activityCloseExitAnimation">@anim/close_out_from_right</item>
</style>

<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">    .
    .
    <item name="android:windowAnimationStyle">@style/transitionPage</item>    .
</style>

參考資料:设置Activity退出动画无效问题的解决

2018年9月15日 星期六

Android-如何用Kotlin簡易設定與監聽按鈕(Button)

想必各位大大從 Java 轉到 Kotlin 有極大的痛楚
此篇就以現在常遇到的狀況下做簡易的介紹

首先我們先把一般情況下的
先把頁面畫出來





















1 . activity_button.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/buttonTest"
        android:layout_width="88dp"
        android:layout_height="48dp"
        android:layout_marginBottom="232dp"
        android:layout_marginEnd="148dp"
        android:layout_marginStart="148dp"
        android:layout_marginTop="231dp"
        android:text="我是按鈕"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

重點來了
以下是 Java 寫法
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class ButtonJavaActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnTest;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnTest = findViewById(R.id.buttonTest);
        btnTest.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buttonTest:
                Toast.makeText(this, "Test", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }
}

以下是 Kotlin 寫法 
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.Button
import android.widget.Toast

class ButtonActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var btnTest: Button;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_button)

        btnTest = findViewById(R.id.buttonTest);
        btnTest.setOnClickListener(this);
        
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.buttonTest -> {
                Toast.makeText(this, "Test", Toast.LENGTH_SHORT).show();
            }
            else -> {

            }
        }
    }
}

Android-新建專案畫面佈局確有問題

在新建專案時想必第一個想法是
直接執行就可以跑在模擬器上了阿

剛開始我也是這樣想
但是自從換電腦後
又是另一回事了
一開啟畫面時馬上出現

Render problem
-Failed to load AppCompat ActionBar with unknown error.

The following classes could not be instantiated:
- android.support.v7.widget.ActionBarContainer (Open Class, Show Exception, Clear Cache)
- android.support.v7.widget.ActionBarContextView (Open Class, Show Exception, Clear Cache)
- android.support.v7.app.WindowDecorActionBar (Open Class, Show Exception, Clear Cache)















看起來並不單純了
東翻西找後
結果發現直接把 Style 修改成
Base.Theme.AppCompat.Light.DarkActionBar













這樣就能順利進行下面的開發了

歡迎轉載,請記得註明出處。


Android-無法開啟 AndroidStudio 模擬器

不知道各位大大是否有在新的電腦安裝 AndroidStudio
無法開啟模擬器的尷尬情況
錯誤訊息為 :

Emulator: emulator: 
ERROR: x86 emulation currently requires hardware acceleration!

然後依照以下的步驟卻一樣的情況發生 :

1 . SDK Tool 下載 Intel X86 Emulator Accelerator(HAXM installer)
















2 . 然後去 Sdk -> extras -> intel -> Hardware_Accelerated_Execution_Manager
安裝 intelhaxm-android.exe















然後沒有動靜,也一樣會出現一樣的錯誤...



上網查才發現
這是 Intel 針對虛擬機的一個設定
Intel VT-d(Intel Virtualization Technology for Directed I/O)
提供虛擬機一個強大的平台
為了避免使用者沒真正的在使用
所以預設都是為關閉的狀態
所以開發者必須要自己去 BIOS 自行該改





















歡迎轉載,請註明出處。

2018年7月29日 星期日

生活實作-真假小米 LED 隨身燈 差很多?

各位米粉好
想必大家對小米隨身燈不陌生嗎
對呀!對呀!
一個燈就要快 100 元那個,沒錯
但是網路上也有出現一個只要 10 元?
對,你沒聽錯!!!
都是燈那有啥差別?
來看接下來的圖吧

1 . 內部結構

看起來隨行燈( 偽 )結構很普通
沒有啥特別的




































2 . 燈光強度 / 集中
( 偽 隨身燈 )





















螢光棒?


( 正 隨身燈 )





















3 . 結論
價格 : 正 > 偽
亮度 : 正 > 偽
集中 : 正 > 偽

2018年7月22日 星期日

Kotlin-變數初始值 lateinit 與 ?= 與 lazy

不曉得個外大大在用 Kotlin 開發 Android 時候
是否有發現為啥無法想 Java 定義一個變數就好
反而還要在定義其他的屬性

我們先來看有哪幾種
1 . lateinit
此宣告是指,晚一點初始化
但此變數是不可為 Null 的










2 . ?=
雖然可以為空值
但是審查的條件也變得相對嚴格
要使用底下功能時
都必須要檢查
不然直接報錯










3 .


參考資料:Kotlin —  lateinit vs lazy
參考資料:[android]活动-lateinit VS 任何?= null
參考資料:Kotlin: Lazy 和 Lateinit 的使用
參考資料:Kotlin: When to Use Lazy or Lateinit

2018年6月20日 星期三

2018年5月26日 星期六

Java - 實作 Interface

希望各位大大看到上一篇的簡述能有些希望
至少能從生活中感覺出來那道光芒
接下來就是 Interface( 接口 )

什麼是 Interface ?
我該怎麼用?

我們先模擬情境吧
現在如果你要開派對
你希望是開聖誕趴?制服趴?
派對必備用品?
所以參加你的派對都必須要遵守( 實作 )!

1 . 制定規範
/**
 * 派對必要裝扮
 * @author brian
 */
public interface DressUp {
    /** 耳環 */
    String earring();
    /** 上衣 */
    String clothes();
    /** 褲子 */
    String pants();
    /** 通關密語 */
    void password();
}


2 . 只要參加都要有此配件才可參加
/**
 * 主題:我家派對
 * @author brian
 */
public class MyParty implements DressUp {

    @Override
    public String earring() {
        // 閃亮配飾
        return "diamond";
    }

    @Override
    public String clothes() {
        // 紅色上衣
        return "redTShirt";
    }

    @Override
    public String pants() {
        // 短褲
        return "shortPants";
    }

    @Override
    public void password() {
        // 心裏通關密語
        System.out.println("內心的通關密語:Cool");
    }

    public static void main(String[] args) {
        MyParty Peter = new MyParty();
        System.out.println("Peter的配飾 : " + Peter.earring());
        System.out.println("Peter的上衣 : " + Peter.clothes());
        System.out.println("Peter的褲子 : " + Peter.pants());
        Peter.password();
    }
}

Peter的配飾 : diamond
Peter的上衣 : redTShirt
Peter的褲子 : shortPants

內心的通關密語:Cool


歡迎轉載,請註明出處。



2018年5月24日 星期四

Java - 繼承 Extends

想必有時候剛入行的大大不知道繼承
剛開始也是讓人挺頭痛的
但是以生活動的例子來說
可能就直接排出掉很多學習障礙囉
我們就拿簡單的範例來說說吧

請依照順序觀看
1 . 父母有啥外觀與您相同?(頭髮、臉蛋、身高、體重)
2 . 我自己外觀長得怎樣?(頭髮、臉蛋、身高、體重)
3 . 長大後我會有哪些轉變?(頭髮、臉蛋、身高、體重)

首先,因為會繼承我父母的基因
public class ParentBody {

    public String hairColor() {
        // 黑頭髮
        return "Black";
    }

    public int height() {
        // 身高
        return 170;
    }

    public boolean glasses() {
        // 戴眼鏡
        return false;
    }

    public String language(String language) {
        // 家人聽能辨別這兩種語言
        if ("English".equals(language)) {
            return "英文";
        } else {
            return "中文";
        }
    }
}


所以我因該會是
public class MyBody extends ParentBody {

    public static void main(String[] arg) {
        ParentBody peter = new MyBody();
        System.out.println("Peter 髮色是 " + peter.hairColor() + " 色");
        System.out.println("Peter 身高是 " + peter.height() + " 公分");
        System.out.println("Peter 戴眼鏡 " + peter.glasses());
        System.out.println("Peter 是說 " + peter.language("Chinese"));
    }

}

Peter 髮色是 Black 色
Peter 身高是 170 公分
Peter 戴眼鏡 false

Peter 是說 中文

但是因為環境改變,我認定是(@override )

public class MyBody extends ParentBody {

    @Override
    public String hairColor() {
        // 因為潮流我就染白髮
        return "white";
    }

    @Override
    public String language(String language) {
        // 但我決定是這樣
        if ("English".equals(language)) {
            return "英文";
        } else if ("Chinese".equals(language)) {
            return "台語";
        } else {
            return "聽不懂";
        }
    }

    public static void main(String[] arg) {
        ParentBody peter = new MyBody();
        System.out.println("Peter 髮色是 " + peter.hairColor() + " 色");
        System.out.println("Peter 身高是 " + peter.height() + " 公分");
        System.out.println("Peter 戴眼鏡 " + peter.glasses());
        System.out.println("Peter 是說 " + peter.language("Chinese"));
    }

}


Peter 髮色是 white 色
Peter 身高是 170 公分
Peter 戴眼鏡 false

Peter 是說 台語

歡迎轉載,請註明出處。






2018年4月15日 星期日

AndroidStudio-AndroidStudio Gradle 版本升級問題

各位大大再升級 Gradle 版本超級順利
但是只要切換成不同專案時不然爆出
Gradle 'XXX' project refresh failed ...
簡單的說專案版本與連結對應版本不符
需要再調整設定

Example :
Caused by: java.lang.RuntimeException: Minimum supported Gradle version is 4.4. Current version is 4.1.

1 . 確定為以上敘述之問題















2 . 確定掛載版本(Version : 4.4)















3 . 更新專案設定






















































參考資料:Gradle version 3.3 does not support forTask() method on BuildActionExecuter

2018年1月18日 星期四

Eclipse-如何在編寫時自動帶入方法

常常在用 Eclipse  開發的各問大大
是否會因為編寫時候
沒有自動產生出可以使用的方法列表

















Intelli-sense
•Windows -> Preferences -> Java -> Editor -> Content Assist
•Auto Activation -> Auto Activation Trigger for Java
•Change "." to ".(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Eclipse-自動添加

2018年1月14日 星期日

Linux-如何在 Window 下安裝 VirtualBox 執行 Linux

在 Window 環境下要如何執行 Linux ?
整體流程是怎樣了 ?

執行步驟 :
1 . 安裝 VirtualBox


























2 . 官網下載 Linux 的 Ubuntu 版本 : 官方網站

























































3 . 執行 VirtualBox ,並且安裝程序步驟




















4 . 設定主機參數















5 . 點選確定後,執行啟動













6 . 成功畫面




















歡迎轉載,請註明出處。