I'm trying to automatically get a URL from my database table online when I click on the button btnDelete. The problem is that it returns the correct values from the database but when try to put it with:
Uri uri = Uri.parse(TAG_url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
It says that "unfortunately, access to database has stopped."
When I make a Log.d() from the TAG_url it returns only "URL" but when I use
txtDesc.setText(product.getString(TAG_url));
it displays correctly the link from the database.
03-14 11:50:18.169: E/Trace(5227): error opening trace file: No such file or directory (2)
03-14 11:50:31.499: E/AndroidRuntime(5227): FATAL EXCEPTION: main
03-14 11:50:31.499: E/AndroidRuntime(5227): java.lang.NullPointerException: uriString
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.net.Uri$StringUri.<init>(Uri.java:464)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.net.Uri$StringUri.<init>(Uri.java:454)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.net.Uri.parse(Uri.java:426)
03-14 11:50:31.499: E/AndroidRuntime(5227): at com.example.androidhive.EditProductActivity1$2.onClick(EditProductActivity1.java:106)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.view.View.performClick(View.java:4084)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.view.View$PerformClick.run(View.java:16966)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.os.Handler.handleCallback(Handler.java:615)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.os.Handler.dispatchMessage(Handler.java:92)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.os.Looper.loop(Looper.java:137)
03-14 11:50:31.499: E/AndroidRuntime(5227): at android.app.ActivityThread.main(ActivityThread.java:4745)
03-14 11:50:31.499: E/AndroidRuntime(5227): at java.lang.reflect.Method.invokeNative(Native Method)
03-14 11:50:31.499: E/AndroidRuntime(5227): at java.lang.reflect.Method.invoke(Method.java:511)
03-14 11:50:31.499: E/AndroidRuntime(5227): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-14 11:50:31.499: E/AndroidRuntime(5227): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-14 11:50:31.499: E/AndroidRuntime(5227): at dalvik.system.NativeStart.main(Native Method)
03-14 11:50:44.299: E/Trace(5251): error opening trace file: No such file or directory (2)
Can anybody help me please?
package com.example.androidhive;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class EditProductActivity extends Activity {
EditText txtName;
EditText txtPrice;
EditText txtDesc;
EditText txtimg;
EditText txtCreatedAt;
Button btnSave;
Button btnDelete;
Button btnvideo;
String pid;
String url;
// Progress Dialog
private ProgressDialog pDialog;
// JSON parser class
JSONParser jsonParser = new JSONParser();
// single product url
private static final String url_product_detials = "http://10.0.2.2/android_connect/get_product_details.php";
// url to update product
private static final String url_update_product = "http://10.0.2.2/android_connect/update_product.php";
// url to delete product
private static final String url_delete_product = "http://10.0.2.2/android_connect/delete_product.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUCT = "product";
private static final String TAG_PID = "pid";
private static final String TAG_NAME = "name";
private static final String TAG_PRICE = "price";
private static final String TAG_DESCRIPTION = "description";
private static final String TAG_img = "img";
private static final String TAG_url = "url";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_product);
// save button
btnSave = (Button) findViewById(R.id.btnSave);
btnDelete = (Button) findViewById(R.id.btnDelete);
// getting product details from intent
Intent i = getIntent();
// getting product id (pid) from intent
pid = i.getStringExtra(TAG_PID);
// Getting complete product details in background thread
new GetProductDetails().execute();
// save button click event
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// starting background task to update product
new SaveProductDetails().execute();
}
});
// Delete button click event
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// deleting product in background thread
Log.v(TAG_url, "index=");
Uri uri = Uri.parse(TAG_url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
});
}
/**
* Background Async Task to Get complete product details
* */
class GetProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity.this);
pDialog.setMessage("Loading movies details. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Getting product 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("pid", pid));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
url_product_detials, "GET", params);
// check your log for json response
Log.d("Single Product Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_PRODUCT); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
// product with this pid found
// Edit Text
url = TAG_url;
Log.v(url, "index=");
txtName = (EditText) findViewById(R.id.inputName);
txtPrice = (EditText) findViewById(R.id.inputPrice);
txtDesc = (EditText) findViewById(R.id.inputDesc);
// txtimg = (EditText) findViewById(R.id.inputimg);
// display product data in EditText
txtName.setText(product.getString(TAG_NAME));
txtPrice.setText(product.getString(TAG_PRICE));
txtDesc.setText(product.getString(TAG_url));
txtimg.setText(product.getString(TAG_img));
} else {
// product with pid not found
}
} catch (JSONException e) {
e.printStackTrace();
}
}
private String getText(String string) {
// TODO Auto-generated method stub
return null;
}
});
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();
}
}
/**
* Background Async Task to Save product Details
* */
class SaveProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity.this);
pDialog.setMessage("Saving product ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Saving product
* */
protected String doInBackground(String... args) {
// getting updated data from EditTexts
String name = txtName.getText().toString();
String price = txtPrice.getText().toString();
String description = txtDesc.getText().toString();
String img = txtimg.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(TAG_PID, pid));
params.add(new BasicNameValuePair(TAG_NAME, name));
params.add(new BasicNameValuePair(TAG_PRICE, price));
params.add(new BasicNameValuePair(TAG_DESCRIPTION, description));
params.add(new BasicNameValuePair(TAG_img, img));
params.add(new BasicNameValuePair(TAG_url, url));
// sending modified data through http request
// Notice that update product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_update_product,
"POST", params);
// check json success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully updated
Intent i = getIntent();
// send result code 100 to notify about product update
setResult(100, i);
finish();
} else {
// failed to update product
}
} 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 product uupdated
pDialog.dismiss();
}
}
}
It looks to me that the var TAG_url is intended to be used only as a descriptor, not as a mutable object. First you have: private static final String TAG_url = "url"; defined as a node name. Using that for txtDesc.setText(product.getString(TAG_url)); works because you're retrieving the data associated with the node "url" (which is what TAG_url holds). In that instance, the data is not in the TAG_url var, but uses TAG_url as the key to find the data.
Any log reference to TAG_url will return it's contents: url. By the same token, a parse call using TAG_url will use it's contents as well. Therefore, Uri uri = Uri.parse(TAG_url); is actually calling Uri uri = Uri.parse("url"); - and so the error.
You should replace the TAG_url in the parse call with a var holding the actual url you intend to call. During your database call, you should store that url in a separate var, and parse it instead.
Edit:
Without knowing the structure of your JSON or other data, I can't say for certain. But as example, lets assume that the data returned from the database via the call product.getString(TAG_url) is the data you want sent to the parser. (I'm assuming that since you mentioned the data was correctly set to the TextView txtDesc when called via txtDesc.setText(product.getString(TAG_url));.)
Given that, you could create a field String incomingURL; at the top of the class, and assign the result of the database call like incomingURL = product.getString(TAG_url);. You would then set the TextView with the new field like txtDesc.setText(incomingURL);.
Then, use that variable for your parse: Uri uri = Uri.parse(incomingURL); That would take the data from the database call, and place it in the parser. Just keep in mind that you'll need to check for incomingURL being null if the button is clickable before the database call completes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With