iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
0
自我挑戰組

在Android Studio 3.x版開發Android系統的開發記事系列 第 4

在Android Studio 3.x版開發Android系統的開發記事-如何呼叫API第一彈(下)

在完成拉好畫面後,首先,要先加網路的權限,打開manifests目錄下的AndroidManifest.xml,加入下述網路權限,如下圖所示:

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

https://ithelp.ithome.com.tw/upload/images/20181010/200009533PsEqX4JiV.jpg

接下來,開始處理程式的部份,在Android Studio 3.x版的中,如果在宣告物件或是在使用物件,如果還沒有import此物件的話,在輸入正確的物件名稱的話,Android Studio會顯示出紅色的文字。所以,只要看到紅色的程式碼或是紅線底線的,通常是表示此物件沒有import或是不正確。
而Android Studio也有貼心的地方,就是會直接顯示是否要自動import或是有其他解決方式,這時,只要Alt + Enter,系統,就會自動import此物件。如下圖所示:

https://ithelp.ithome.com.tw/upload/images/20181010/200009538nnqlfZy1c.jpg

在要Override監聽事件時,Android Studio 也要自動的判斷可能是那個事件,而一直列出,如下圖示:
https://ithelp.ithome.com.tw/upload/images/20181010/20000953nZVuUVPXuE.jpg
這時,只要按下Enter,就會自動建立此事件的程式碼,不用自已一個一個字的打上去。如下圖示:
https://ithelp.ithome.com.tw/upload/images/20181010/20000953Tu5mzDZwVI.jpg

完整的程式碼如下:
public class MainActivity extends AppCompatActivity {

    //宣告物件名稱。
    private RequestQueue objqueue;
    private final static String strurl = "http://192.168.1.102:8088/get_json.php";

    private TextView lbl_result;
    private StringRequest getRequest;

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

        //物件名稱跟Layout上的物件,產生連結。
        lbl_result = (TextView)findViewById(R.id.lblresult);

        //設定Volley物件。
        objqueue = Volley.newRequestQueue(this);

        //實做Volley物件,在StringRequest的函式,預設值就是Request.Method.GET,可以省略。
        //而strurl,就是要GET的API網址。
        //最後,還要Override二個監聽的事件。
        getRequest = new StringRequest(strurl, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                //response,表示是回傳值,就是API要回傳的字串,也可以是JSON字串。
                lbl_result.setText(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //如果發生錯誤,就是回傳VolleyError,可以顯示是什麼錯誤。
                lbl_result.setText(error.getMessage());
            }
        });
    }

//建立此函式,要設定Button的觸發事件函式。
public void prc_getmessage (View v) {
    
    //將getRequest物件加入Volley物件的queue中,執行跟API的溝通。
    objqueue.add(getRequest);
}
}

在Server端的PHP API程式碼:

<?php
    echo json_encode(array('id' => 'A123456789', 'name' => 'jack'));
?>

就簡單的回傳JSON字串即可。

這裡,Android Studio,還有一個好用的地方,就是對Button物件,可以在設計畫面中,點選Button物件,在屬性的onClick,就可以直接設定監聽事件的函式,不用還要在程式裡的設定。
https://ithelp.ithome.com.tw/upload/images/20181010/20000953NtNVWcGuKe.jpg

最後,設定好模擬機,再執行程式吧。結果,發現出現錯誤「java.io.ioexception:cleartext http traffic to 192.168.1.102 not permitted」,去Google大神,來找為何會發生此問題,才發現是因為沒有權限。

https://ithelp.ithome.com.tw/upload/images/20181010/20000953EFfMmX4Fml.jpg

主要是Google為了保證用戶的資料及設備的安全,針對新版的Android的應用程式,將要求默認使用加密連接。要用https,不要再用http。比較安全。

目前有三種解決方案:
一、 APP改用https協定,來溝通API。
二、 在target SDK Version的版本降到27以下。
三、 設定一個xml檔案,來允許開啟http請求。

在此,是用第三種方式,來解決此問題。在res目錄,建立一個xml的子目錄,在此目錄,再建立一個檔案,叫「network_security_config.xml」,注意是一個檔案,不是什麼xml檔。如下圖所示:
https://ithelp.ithome.com.tw/upload/images/20181010/20000953CKSvMKyOgv.jpg
xml檔案的內容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

最後,在AndroidManifest.xml檔案的內容中,增加
android:networkSecurityConfig="@xml/network_security_config"
如下圖所示:
https://ithelp.ithome.com.tw/upload/images/20181010/20000953ONndwqWu73.jpg

在執行模擬器,就成功的呼叫API,回傳JSON的字串。
https://ithelp.ithome.com.tw/upload/images/20181010/20000953ERhWzM57Ox.jpg

完成了GET的呼叫,明天,要進行POST的呼叫。


上一篇
在Android Studio 3.x版開發Android系統的開發記事-如何呼叫API第一彈(上)
下一篇
在Android Studio 3.x版開發Android系統的開發記事-如何呼叫API第二彈
系列文
在Android Studio 3.x版開發Android系統的開發記事30

尚未有邦友留言

立即登入留言