在完成拉好畫面後,首先,要先加網路的權限,打開manifests目錄下的AndroidManifest.xml,加入下述網路權限,如下圖所示:
<uses-permission android:name="android.permission.INTERNET" />
接下來,開始處理程式的部份,在Android Studio 3.x版的中,如果在宣告物件或是在使用物件,如果還沒有import此物件的話,在輸入正確的物件名稱的話,Android Studio會顯示出紅色的文字。所以,只要看到紅色的程式碼或是紅線底線的,通常是表示此物件沒有import或是不正確。
而Android Studio也有貼心的地方,就是會直接顯示是否要自動import或是有其他解決方式,這時,只要Alt + Enter,系統,就會自動import此物件。如下圖所示:
在要Override監聽事件時,Android Studio 也要自動的判斷可能是那個事件,而一直列出,如下圖示:
這時,只要按下Enter,就會自動建立此事件的程式碼,不用自已一個一個字的打上去。如下圖示:
完整的程式碼如下:
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,就可以直接設定監聽事件的函式,不用還要在程式裡的設定。
最後,設定好模擬機,再執行程式吧。結果,發現出現錯誤「java.io.ioexception:cleartext http traffic to 192.168.1.102 not permitted」,去Google大神,來找為何會發生此問題,才發現是因為沒有權限。
主要是Google為了保證用戶的資料及設備的安全,針對新版的Android的應用程式,將要求默認使用加密連接。要用https,不要再用http。比較安全。
目前有三種解決方案:
一、 APP改用https協定,來溝通API。
二、 在target SDK Version的版本降到27以下。
三、 設定一個xml檔案,來允許開啟http請求。
在此,是用第三種方式,來解決此問題。在res目錄,建立一個xml的子目錄,在此目錄,再建立一個檔案,叫「network_security_config.xml」,注意是一個檔案,不是什麼xml檔。如下圖所示:
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"
如下圖所示:
在執行模擬器,就成功的呼叫API,回傳JSON的字串。
完成了GET的呼叫,明天,要進行POST的呼叫。