0

I tried to retrieved jsonArray from the website: http://www.spmsejarahscore.epizy.com/androidbackend/spmpast.php. Volley getting JsonArray is workable on locahost where it shown a list view, but when I implement the spmpast.php on website, the list view output is empty on actual device and crash on emulator. I hope to seek guide here as this is my Final Project.

MainActivity.xml

public class SpmPastActivity extends CodeReuse {

// 185.27.134.131
// www.spmsejarahscore.epizy.com
public static final String JSON_URL = "http://www.spmsejarahscore.epizy.com/androidbackend/spmpast.php";
public ListView listView;
private ProgressBar loading;

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

    barRule();
    getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_arrow_left_white);

    sendRequest();
}

private void sendRequest(){
    loading = (ProgressBar) findViewById(R.id.progressBar);
    StringRequest stringRequest = new StringRequest(Request.Method.GET,JSON_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.wtf("RESPONSE", response);
                    showJSON(response);
                    loading.setVisibility(View.INVISIBLE);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                            Toast.makeText(SpmPastActivity.this,error.getMessage(),Toast.LENGTH_LONG).show();
                }
            });

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}

private void showJSON(String json){
    ParseJSON pj = new ParseJSON(json);
    pj.sParseJSON();
    SCustomList cl = new SCustomList(this, ParseJSON.ids, ParseJSON.years, ParseJSON.pdfs);

    listView = (ListView) findViewById(R.id.listView);
    listView.setAdapter(cl);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ViewGroup vg = (ViewGroup) view;
            TextView tv = (TextView) vg.findViewById(R.id.stateYear);
            String url = tv.getTag().toString();

// Toast.makeText(SpmPastActivity.this, url, Toast.LENGTH_LONG).show();

            String doc = "https://docs.google.com/viewer?url=" + url;

            Intent intent = new Intent(SpmPastActivity.this, PdfFullscreenActivity.class);
            intent.putExtra("PDF_TAG", doc);
            startActivity(intent);
        }
    });
}

ParseJson.java:

public class ParseJSON {
public static String[] ids;
public static String[] years;
public static String[] pdfs;

public static final String JSON_ARRAY = "result";
public static final String KEY_ID = "id";
public static final String KEY_YEAR = "year";
public static final String KEY_PDF = "pdf_path";

private JSONArray users = null;

private String json;

public ParseJSON(String json){
    this.json = json;
}

protected void sParseJSON(){
    JSONObject jsonObject = null;
    try {
        jsonObject = new JSONObject(json);
        users = jsonObject.getJSONArray(JSON_ARRAY);

        ids = new String[users.length()];
        years = new String[users.length()];
        pdfs = new String[users.length()];

        for(int i=0;i < users.length();i++){
            JSONObject jo = users.getJSONObject(i);
            ids[i] = jo.getString(KEY_ID);    // work on loaclhost
            years[i] = "SPM Year " + jo.getString(KEY_YEAR);    // work on loaclhost
            pdfs[i] = "http://www.spmsejarahscore.epizy.com/web/media/pdf/" + jo.getString(KEY_PDF);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
}

logcat:

07-27 06:37:13.465 1591-1603/system_process I/ActivityManager: START u0 {act=com.foong.spmsejarahscore.SpmPastActivity cmp=com.foong.spmsejerahscore/.SpmPastActivity} from pid 12003
07-27 06:37:13.605 12003-12003/com.foong.spmsejerahscore D/EXECUETE: before ProgressBar
07-27 06:37:13.615 12003-12003/com.foong.spmsejerahscore D/EXECUETE: before StringRequest
07-27 06:37:13.635 12003-12118/com.foong.spmsejerahscore D/dalvikvm: GC_FOR_ALLOC freed 322K, 2% free 24342K/24732K, paused 10ms, total 13ms
07-27 06:37:13.825 12003-12003/com.foong.spmsejerahscore D/EGL_emulation: eglMakeCurrent: 0xb8b613a0: ver 2 0
07-27 06:37:14.475 12003-12003/com.foong.spmsejerahscore I/Choreographer: Skipped 36 frames!  The application may be doing too much work on its main thread.
07-27 06:37:14.585 12003-12003/com.foong.spmsejerahscore D/EGL_emulation: eglMakeCurrent: 0xb8b613a0: ver 2 0
07-27 06:37:14.625 1591-1605/system_process I/ActivityManager: Displayed com.foong.spmsejerahscore/.SpmPastActivity: +1s117ms
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore D/RESPONSE: <html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("72b0c45f6fbda01cced41959e9e196a1");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://www.spmsejarahscore.epizy.com/androidbackend/spmpast.php?i=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err: org.json.JSONException: Value <html><body><script of type java.lang.String cannot be converted to JSONObject
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:159)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:172)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.foong.spmsejerahscore.ParseJSON.sParseJSON(ParseJSON.java:88)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.foong.spmsejerahscore.SpmPastActivity.showJSON(SpmPastActivity.java:76)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.foong.spmsejerahscore.SpmPastActivity.access$000(SpmPastActivity.java:22)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.foong.spmsejerahscore.SpmPastActivity$1.onResponse(SpmPastActivity.java:59)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.foong.spmsejerahscore.SpmPastActivity$1.onResponse(SpmPastActivity.java:55)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at android.os.Handler.handleCallback(Handler.java:733)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at android.os.Looper.loop(Looper.java:136)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5017)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/System.err:     at dalvik.system.NativeStart.main(Native Method)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore D/AndroidRuntime: Shutting down VM
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4cc8b20)
07-27 06:37:14.725 12003-12003/com.foong.spmsejerahscore E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.foong.spmsejerahscore, PID: 12003
                                                                           java.lang.NullPointerException: storage == null
                                                                               at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
                                                                               at java.util.Arrays.asList(Arrays.java:155)
                                                                               at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
                                                                               at com.foong.spmsejerahscore.SCustomList.<init>(SCustomList.java:34)
                                                                               at com.foong.spmsejerahscore.SpmPastActivity.showJSON(SpmPastActivity.java:77)
                                                                               at com.foong.spmsejerahscore.SpmPastActivity.access$000(SpmPastActivity.java:22)
                                                                               at com.foong.spmsejerahscore.SpmPastActivity$1.onResponse(SpmPastActivity.java:59)
                                                                               at com.foong.spmsejerahscore.SpmPastActivity$1.onResponse(SpmPastActivity.java:55)
                                                                               at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
                                                                               at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
                                                                               at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
                                                                               at android.os.Handler.handleCallback(Handler.java:733)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:136)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5017)
                                                                               at java.lang.reflect.Method.invokeNative(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:515)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                                               at dalvik.system.NativeStart.main(Native Method)
07-27 06:37:14.795 1591-2433/system_process W/ActivityManager:   Force finishing activity com.foong.spmsejerahscore/.SpmPastActivity
07-27 06:37:14.825 1591-2433/system_process W/ActivityManager:   Force finishing activity com.foong.spmsejerahscore/.MenuActivity

I follow guideline from https://www.simplifiedcoding.net/android-volley-tutorial-to-get-json-from-server/. The result should show a list view.

Foong
  • 5
  • 4

2 Answers2

0

StringRequest for the mentioned url gets response as:

<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("dc7d8d143d0ed123d7b543cf7a2c48fd");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://www.spmsejarahscore.epizy.com/androidbackend/spmpast.php?i=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>

Hence you get a parsing exception. Try using some other request form such as JsonObjectRequest.

Sanket Mendon
  • 403
  • 5
  • 11
  • Thx for reply. I will try on JsonObjectRequest and Asynctask method. But is it really no other way to try on StringRequest other than change request method? – Foong Jul 27 '17 at 09:24
  • The issue is not with the request type. Your way of implementing a request is correct, But the response which you get cannot be parsed to a JSON format. Seems there is some catch with your url. Try your url on postman or any rest client and you will see that the response is an html tag. Try this url and observe its response: http://jsonplaceholder.typicode.com/comments The response which you will get from this url is a json object which can be parsed. – Sanket Mendon Jul 27 '17 at 09:47
  • I have tried on the postman, it did show the html as what you post just now. The url that you gave me shows the json array. Thx for the guidance. May I know how to implement the php in order to get the jsonArray? Currently I am using the free hosting, infinityFree to store my project. – Foong Jul 27 '17 at 10:43
  • I'm sorry I didn't get you. Are you asking what can be done at the php end in order to get response as a jsonarray? – Sanket Mendon Jul 27 '17 at 13:24
  • Ya. Upon checking resources from the Google, I found that, it is because of the security check from the hosting provider. The link resources are https://stackoverflow.com/questions/31912000/byethost-server-passing-html-values-checking-your-browser-with-json-string/40684122#40684122 and https://stackoverflow.com/questions/40806052/generating-cookie-from-website-that-implements-testcookie-nginx-module. However non of them given example about volley. I have tried the code by implementing new class, but not working. Can you help me out with this? – Foong Jul 27 '17 at 13:32
  • In this case something will have to be done at your php service end. Will update you as soon as I get something. – Sanket Mendon Jul 28 '17 at 08:07
  • Thank you very much. I hope to get some solution as soon as possible. – Foong Jul 29 '17 at 12:36
0

I found two places where there might be some error. First you haven't provide the method type in your Volley request string.

 StringRequest stringRequest = new StringRequest(Request.Method.GET,JSON_URL,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.wtf("RESPONSE", response);
                showJSON(response);
                loading.setVisibility(View.INVISIBLE);
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                        Toast.makeText(SpmPastActivity.this,error.getMessage(),Toast.LENGTH_LONG).show();
            }
        });

and 2nd is while parsing you have to provide the array name.

    JSONObject jsonObject = new JSONObject(json);
    users = jsonObject.getJSONArray("result");
Ashutosh Sagar
  • 981
  • 8
  • 20
  • Thx for reply. After added Request.Method.GET, the result still the same. Sorry for not posting the whole ParseJson.java. I have edited the class. The parsing should be no problem since it work when getting json from localhost. – Foong Jul 27 '17 at 09:21