0

I'm trying to display information depending on the item pressed in a ListView. I'm using a HTTP GET request to get the information.

When you click on an item (profile) in the ListView the application gets that profile name and depending on that it should display that profile's information in the next activity but that's not working and I keep getting a JSONException error. I don't know what is causing or if my approach to achieve this is wrong, any help would be great. Thanks.

Here I'm sending the profile's name to the next activity (This class has more code but it's not relevant for this question):

public class EditProfiles extends BaseListActivity implements GetProfilesListener{

TextView errorMessage;
String email;

private static final String TAG_PNAME = "profilename";


/**
 * Called when activity is first created.
 */
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_profiles);


ListView list = getListView();
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,                   
                int position, long id) {
            // getting values from selected ListItem
            String profilename = ((TextView) view.findViewById(R.id.editProfiles_profile_name)).getText()
                    .toString();

            Intent in = new Intent(getApplicationContext(), EditSingleProfile.class);

            // sending profilename to next activity
            in.putExtra(TAG_PNAME, profilename);

            // Starts activity 
            startActivity(in);

        }

    });

}

This is the activity where I want to get the details from the profile:

public class EditSingleProfile extends BaseViewEditProfile{

Spinner inputType;
EditText inputName;
EditText inputAge;
EditText inputBreed;
EditText inputAbout;
ImageView selectPicture;
Button change;
TextView message;

//Json node names.
private static final String TAG_SUCCESS = "success";
private static final String TAG_PROFILE = "profile";
private static final String TAG_PNAME = "profilename";
private static final String TAG_PAGE = "petage";
private static final String TAG_BREED = "petbreed";
private static final String TAG_ABOUT = "profileabout";

//JSON parser class
JSONParser jsonParser = new JSONParser();

// single profile url
private static final String url_profile_details = "http://gatoandroidapp.comeze.com/profile_details.php";

//Create field SELECT_PICTURE to be used in the class.
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
String pimage;
String profilename;

    /**
     * Called when activity is created.
     */
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_profile_view);  
         StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

        // getting profile details from intent
        Intent i = getIntent();

        // getting profile name from intent
        profilename = i.getStringExtra(TAG_PNAME);

        // Sets view title.
        this.setTitle(profilename);

        // Get profile's details in Background Thread
        new GetProfiles().execute();

               /**
         * Background AsyncTask to Get profile details.
         */
        class GetProfiles extends AsyncTask<String, String, String> {

            // Progress Dialog
            private ProgressDialog pDialog;
            /**
             * Before starting background thread Show Progress Dialog
             */
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(EditSingleProfile.this);
                pDialog.setMessage("Loading profile details...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(true);
                pDialog.show();
            }

            /**
             * Getting profile details in background thread
             */
            protected String doInBackground(String... params) {

                // updating UI from Background Thread
                runOnUiThread(new Runnable() {
                    public void run() {
                        // Check for success tag
                        int success;
                        try {
                            // Building Parameters
                            List<NameValuePair> params = new ArrayList<NameValuePair>();
                            params.add(new BasicNameValuePair("profilename", profilename));

                            // getting profile details by making HTTP request
                            JSONObject json = jsonParser.makeHttpRequest(
                                    url_profile_details, "GET", params);

                            // check your log for json response
                            Log.d("Single Profile Details", json.toString());

                            // json success tag
                            success = json.getInt(TAG_SUCCESS);
                            if (success == 1) {
                                // successfully received product details
                                JSONArray profileObj = json
                                        .getJSONArray(TAG_PROFILE); // JSON Array

                                // get first profile object from JSON Array
                                JSONObject profile = profileObj.getJSONObject(0);

                                inputName = (EditText) findViewById(R.id.editProfile_profileName_editText);
                                inputAge = (EditText) findViewById(R.id.editProfile_age_editText);
                                inputBreed = (EditText) findViewById(R.id.editProfile_breed_editText);
                                inputAbout = (EditText) findViewById(R.id.editProfile_about_editText);

                                // display product data in EditText
                                inputName.setText(profile.getString(TAG_PNAME));
                                inputAge.setText(profile.getString(TAG_PAGE));
                                inputBreed.setText(profile.getString(TAG_BREED));
                                inputAbout.setText(profile.getString(TAG_ABOUT));

                            }else{
                                // profile with name not found
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

                return null;
            }

            /**
             * After completing background task Dismiss the progress dialog.
             */
            protected void onPostExecute(String file_url) {
                // dismiss the dialog once got all details
                pDialog.dismiss();
            }
        }

This is my JSON parser:

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

    // Making HTTP request
    try {

        // check for request method
        if(method.equalsIgnoreCase("POST")){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }else if(method.equalsIgnoreCase("GET")){
            // request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }           


    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

This is my PHP code:

<?php

/*
 * Gets single profile details
 * A profile is identified by profile name (pname)
 */

// array for JSON response
$response = array();


// include db connect class
require_once __DIR__ . '/DB_Connect.php';

// connecting to db
$db = new DB_CONNECT();

// check for post data
if (isset($_GET["profilename"])) {
    $profilename = $_GET['profilename'];

    // get a profile from profiles table
    $result = mysql_query("SELECT * FROM profiles WHERE profilename = $profilename");

    if (!empty($result)) {
        // check for empty result
        if (mysql_num_rows($result) > 0) {

            $result = mysql_fetch_array($result);

            $profile = array();
            $profile["profilename"] = $result["profilename"];
            $profile["petage"] = $result["petage"];
            $profile["petbreed"] = $result["petbreed"];
            $profile["profileabout"] = $result["profileabout"];

            // success
            $response["success"] = 1;

            // user node
            $response["profile"] = array();

            array_push($response["profile"], $profile);

            // echoing JSON response
            echo json_encode($response);
        } else {
            // no profile found
            $response["success"] = 0;
            $response["message"] = "No profile found";

            // echo no users JSON
            echo json_encode($response);
        }
    } else {
        // no profile found
        $response["success"] = 0;
        $response["message"] = "No profile found";

        // echo no users JSON
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

This is the error log:

04-07 16:22:00.156: E/JSON Parser(15588): Error parsing data org.json.JSONException: Value <br><table of type java.lang.String cannot be converted to JSONObject
04-07 16:22:00.156: D/AndroidRuntime(15588): Shutting down VM
04-07 16:22:00.156: W/dalvikvm(15588): threadid=1: thread exiting with uncaught exception (group=0x4123f908)
04-07 16:22:00.159: E/AndroidRuntime(15588): FATAL EXCEPTION: main
04-07 16:22:00.159: E/AndroidRuntime(15588): java.lang.NullPointerException
04-07 16:22:00.159: E/AndroidRuntime(15588):    at com.gmail.lucsantisf.software_project.views.EditSingleProfile$GetProfiles$1.run(EditSingleProfile.java:249)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.os.Handler.handleCallback(Handler.java:615)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.os.Looper.loop(Looper.java:153)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at android.app.ActivityThread.main(ActivityThread.java:5006)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at java.lang.reflect.Method.invokeNative(Native Method)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at java.lang.reflect.Method.invoke(Method.java:511)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
04-07 16:22:00.159: E/AndroidRuntime(15588):    at dalvik.system.NativeStart.main(Native Method)

Thanks for any help.

4 Answers 4

1

Well I fixed the error, the problem had to do with the connection in the PHP file and this line : require_once DIR . '/DB_Connect.php';.

I used Log.d("JSON Parser", json ); to read the PHP error in logcat in eclipse and it kept telling me that failed to open stream: no such file or directory and fail opening requires so I put the file required in the same directory as my php file and in the php file and I replaced this line: require_once _DIR_ . '/DB_Connect.php'; with this: require_once 'DB_Connect.php';

The java code is perfect in case that someone is trying to do something similar.

Sign up to request clarification or add additional context in comments.

Comments

0

It looks like the response you are getting is not valid JSON. The Value <br><table of type java.lang.String indicates you are getting HTML code as the response which it cannot map to your objects.

Try doing a

Log.d("JSON Parser", json);

Just before your comment // try parse the string to a JSON object

1 Comment

I just did and It says I have a PHP error message, it also says: fail to open stream: no such file or directory in profile_details.php and Failed opening requires '_DIR_/DB_Connect.php' the rest is html
0

With Logcat output the url you are requesting and try to visualize the response, and pay attention to the symbols and tags like < />, they should be escaped. May be the parser has encounter an array and you are telling to convert to an object.

Comments

0

this error can be because when you execute PHP code appear this error:

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

And it gets this error through JSON:

<br>Deprecated</br>...

So, if you put in your php code something like this:

error_reporting(E_ALL ^ E_DEPRECATED);

This error will be fixed.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.