JSON仅适用于Debug模式,但不适用于android中的apk文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON仅适用于Debug模式,但不适用于android中的apk文件相关的知识,希望对你有一定的参考价值。
我的android应用程序仅适用于调试模式,但当我将应用程序转换为apk文件时不起作用。我发现仅json的问题。虽然我关闭了网络(即Internet),但它运行良好,但我打开了网络并尝试打开我的应用程序,这将导致应用程序崩溃。
这是我的代码
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.StrictMode;
import android.support.v4.app.FragmentActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class MapList extends Activity {
GoogleMap Gmap;
GPSTracker gps;
JSONObject jobj;
EditText searchEdit;
double longitude;
double latitude;
Marker blueMarker,redMarker;
String Countryname;
Context con=MapList.this;
public static final String URl="http://www.dealsocl.com/mysql2json_SG.php";
RelativeLayout listRelative,mapRelative;
// public static final String URl="http://192.168.0.6/singapore_dealsocl/mysql2json_TM.php";
public static final String Tag_val="data";
public static final String Tag_dealid="dealid";
public static final String Tag_title="title";
public static final String Tag_price="price";
public static final String Tag_worth="value";
public static final String Tag_saving="saving";
public static final String Tag_saving_percent="saving_percent";
public static final String Tag_imageurl="imageurl";
public static final String Tag_link="link";
public static final String Tag_latitude="latitude";
public static final String Tag_longitude="longitude";
public static final String Tag_siteName="name";
public static final String Tag_price_sign="price_sign";
public static final String Tag_cat_seo="cat_seo_title";
ArrayList<String>lat_arry=new ArrayList<String>();
ArrayList<String>long_arry=new ArrayList<String>();
ArrayList<String>deal_tite=new ArrayList<String>();
ArrayList<Double> mydoublat=new ArrayList<Double>();
ArrayList<Double> mydoublong=new ArrayList<Double>();
ArrayList<HashMap<String, String>>details=new ArrayList<HashMap<String,String>>();
ArrayList<HashMap<String, String>> searchResults=new ArrayList<HashMap<String,String>>(details);
HashMap<String, String>map;
ListAdapter myAdapter;
ListView DataList;
ImageView nearby,search,home,account;
String s;
//String[] url={"http://www.dealsocl.com/mysql2json_SG.php","http://www.dealsocl.in/mysql2json_IN.php"};
ArrayList<String>url=new ArrayList( Arrays.asList( new String[]{"http://www.dealsocl.in/mysql2json_IN.php","http://www.dealsocl.com/mysql2json_SG.php","http://www.dealsocl.com/mysql2json_AE.php"} ) );
@SuppressLint("NewApi") @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maplist);
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
gps = new GPSTracker(MapList.this);
ConnectivityManager connectivityManager = (ConnectivityManager)
con.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobileInfo =
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifiInfo.isConnected() || mobileInfo.isConnected()) {
// Toast.makeText(getApplicationContext(), "network connected", 1000).show();
if(gps.canGetLocation()){
latitude = gps.getLatitude();
longitude = gps.getLongitude();
Log.e("laaaaaaaaaatttttttiiiiiiii", ""+latitude);
Log.e("longiiiiiiiiiiiiiiiiii", ""+longitude);
Toast.makeText(getApplicationContext(), "Your Location is -
Lat: " + latitude + "
Long: " + longitude, Toast.LENGTH_LONG).show();
}else{
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
// gps.showSettingsAlert();
Toast.makeText(getApplicationContext(), "Gps is not enabled", Toast.LENGTH_LONG).show();
Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);
latitude = gps.getLatitude();
longitude = gps.getLongitude();
Toast.makeText(getApplicationContext(), "Your Location is -
Lat: " + latitude + "
Long: " + longitude, Toast.LENGTH_LONG).show();
}
//<------------------------------------------------------------------------------------------------------------------------>
Geocoder geoCoder = new Geocoder(getBaseContext());
Log.e("latii1", ""+latitude);
Log.e("longiiiiiiiiiiiiiiiiii", ""+longitude);
List<Address> matches = null;
try {
Log.e("latiiii2", ""+latitude);
Log.e("longiiiiiiiiiiiiiiiiii", ""+longitude);
matches = geoCoder.getFromLocation( latitude, longitude, 1);
//Toast.makeText(getApplicationContext(),""+matches, 1000).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Address bestMatch = (matches.isEmpty() ? null : matches.get(0));
//String countryname=bestMatch.getCountryName().toString();
Toast.makeText(getApplicationContext(),"Your country name is:"+bestMatch.getCountryName(), 1000).show();
Countryname=bestMatch.getCountryName().toUpperCase().toString();
Log.e("address", ""+Countryname);
//<------------------------------------------------------------------------------------------------------------------------->
if(Countryname.equalsIgnoreCase("India")){
s=url.get(0).toString();
Log.e("country check1",s);
MyAsyncTask myAsyncTask=new MyAsyncTask();
myAsyncTask.execute(s);
}else if(Countryname.equalsIgnoreCase("SINGAPORE")){
s=url.get(1).toString();
Log.i("country check1", s);
MyAsyncTask myAsyncTask=new MyAsyncTask();
myAsyncTask.execute(s);
}else if(Countryname.equalsIgnoreCase("UNITED ARAB EMIRATES")){
s=url.get(2).toString();
Log.e("country check1", s);
MyAsyncTask myAsyncTask=new MyAsyncTask();
myAsyncTask.execute(s);
}else{
Toast.makeText(getApplicationContext(), "Currently no deals in your location", 1000).show();
}
}else{
RelativeLayout rl=(RelativeLayout)findViewById(R.id.realtivemap1);
RelativeLayout rl1=(RelativeLayout)findViewById(R.id.listrlayout2);
//TextView alertText=(TextView)findViewById(R.id.textAlert);
rl.setVisibility(View.VISIBLE);
rl1.setVisibility(View.INVISIBLE);
new Handler().postDelayed(new Runnable() {
public void run() {
finish();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(R.animator.left_to_right, R.animator.slide_out_bottom);
}
}, 10000);
}
DataList=(ListView)findViewById(R.id.listView1);
searchEdit=(EditText)findViewById(R.id.searchEd);
mapRelative=(RelativeLayout)findViewById(R.id.realtivemap1);
listRelative=(RelativeLayout)findViewById(R.id.listrlayout2);
searchEdit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
//clear the initial data set
String searchString=searchEdit.getText().toString();
int textLength=searchString.length();
//clear the initial data set
searchResults.clear();
for(int i=0;i<details.size();i++)
{
String titleString=details.get(i).get(Tag_title).toString();
if(textLength<=titleString.length()){
//compare the String in EditText with Names in the ArrayList
if(searchString.equalsIgnoreCase(titleString.substring(0,textLength)))
/* Toast.makeText(getApplicationContext(),playerName,1).show();*/
searchResults.add(details.get(i));
}
}
myAdapter=new LazyAdapter1(MapList.this, searchResults);
DataList.setAdapter(myAdapter);
((BaseAdapter) myAdapter).notifyDataSetChanged();
/* MapListActivity.this.myAdapter.getFilter().filter(s); */
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
DataList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
String title=((TextView) view.findViewById(R.id.getText_s_)).getText().toString();
String price=((TextView) view.findViewById(R.id.Price_s_)).getText().toString();
String savings=((TextView) view.findViewById(R.id.Saving_s_)).getText().toString();
String worth=((TextView) view.findViewById(R.id.Worth_s_)).getText().toString();
String discount=((TextView) view.findViewById(R.id.Discount_s_)).getText().toString();
String sitename=((TextView) view.findViewById(R.id.Site_n_)).getText().toString();
String imageText=((TextView) view.findViewById(R.id.ImageTextURl_s_)).getText().toString();
String lat=((TextView) view.findViewById(R.id.lat_s)).getText().toString();
String lng=((TextView) view.findViewById(R.id.lng_s)).getText().toString();
Log.i(Tag_title, title);
Log.i(Tag_price, price);
Log.i(Tag_saving, savings);
Log.i(Tag_worth, worth);
Log.i(Tag_saving_percent, discount);
Log.i(Tag_siteName, sitename);
Log.i(Tag_imageurl, imageText);
/*Log.i(Tag_latitude,""+lat);
Log.i(Tag_longitude,""+ lng);*/
Intent in = new Intent(getApplicationContext(), First.class);
in.putExtra(Tag_title, title);
in.putExtra(Tag_price, price);
in.putExtra(Tag_saving, savings);
in.putExtra(Tag_worth, worth);
in.putExtra(Tag_saving_percent, discount);
in.putExtra(Tag_siteName, sitename);
in.putExtra(Tag_imageurl, imageText);
in.putExtra(Tag_latitude, lat);
in.putExtra(Tag_longitude, lng);
startActivity(in);
}
});
}
class MyAsyncTask extends AsyncTask<String, Integer, ArrayList<HashMap<String, String>> > {
ProgressDialog dialog;
@Override
protected ArrayList<HashMap<String, String>> doInBackground(String... params) {
/* JSONObject json = JSONfunctions.getJSONfromURL(params[0]);*/
JsonParser parser=new JsonParser();
try {
jobj=parser.getJsonUrl(s);
Log.e("jobj", ""+jobj);
JSONArray array=jobj.getJSONArray(Tag_val);
/*Log.e("array", ""+array);*/
for(int i=0;i<array.length();i++){
/* Log.e("array", ""+array);*/
JSONObject c=array.getJSONObject(i);
/*Log.e("object", ""+c);*/
/*String id=c.getString(Tag_dealid);*/
String title=c.getString(Tag_title);
String price=c.getString(Tag_price);
String value=c.getString(Tag_worth);
String saving=c.getString(Tag_saving);
String sav_perc=c.getString(Tag_saving_percent);
/*String link=c.getString(Tag_link);*/
String lat=c.getString(Tag_latitude);
String longi=c.getString(Tag_longitude);
String image=c.getString(Tag_imageurl);
String siteName=c.getString(Tag_siteName);
String price_sign=c.getString(Tag_price_sign);
String cat_seo_title=c.getString(Tag_cat_seo);
Log.i("lat", lat);
Log.i("longi",longi);
lat_arry.add(lat);
long_arry.add(longi);
deal_tite.add(title);
Log.e("lat_arry",lat_arry.get(i));
Log.e("long_arry",long_arry.get(i));
map=new HashMap<String, String>();
//map.put(Tag_dealid, id);
map.put(Tag_title, title);
map.put(Tag_worth, value);
map.put(Tag_saving, saving);
map.put(Tag_saving_percent, sav_perc);
map.put(Tag_price,price);
map.put(Tag_siteName,siteName);
map.put(Tag_price_sign,price_sign);
// map.put(Tag_link, link);
map.put(Tag_latitude, lat);
map.put(Tag_longitude, longi);
map.put(Tag_imageurl, image);
map.put(Tag_cat_seo, cat_seo_title);
/*Double long1 = longitude;
Double lat1 = latitude;
String[] doublong= long_arry.toArray(new String[long_arry.size()]);
doublong=long_arry.toArray(doublong);
double[] doub_long = new double[doublong.length];
doub_long[i] = Double.parseDouble(doublong[i]);
mydoublong.add(doub_long[i]);
String[] doublat= lat_arry.toArray(new String[lat_arry.size()]);
doublong=lat_arry.toArray(doublong);
double[] doub_lat = new double[doublat.length];
doub_lat[i] = Double.parseDouble(doublat[i]);
mydoublat.add(doub_lat[i]);
Double d=DistanceBetweenPlaces(longitude,latitude, mydoublong.get(i), mydoublat.get(i));
String distance=new Double(d).toString();
Log.w("Distance", ""+distance);
map.put("dist", distance);*/
details.add(map);
}
return details;
}catch(JSONException e) {
Log.e("log_tag", "Error parsing data "+e.toString());
}
return null;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
myAdapter=new LazyAdapter1(MapList.this, details);
DataList.setAdapter(myAdapter);
dialog.dismiss();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(MapList.this);
dialog.setMessage("Your deals are loading....");
/* dialog.setIndeterminate(false);*/
dialog.setCancelable(false);
dialog.show();
}
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
finish();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(R.animator.left_to_right, R.animator.slide_out_bottom);
}
}
这是我的json解析器代码:
public class JsonParser {
JSONObject jobj;
String json="";
InputStream is=null;
public JSONObject getJsonUrl(String url){
DefaultHttpClient client=new DefaultHttpClient();
HttpPost post=new HttpPost(url);
try {
HttpResponse response=client.execute(post);
HttpEntity entity=response.getEntity();
is=entity.getContent();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
BufferedReader br=new BufferedReader(new InputStreamReader(is, "iso-8859-1"),8);
StringBuilder sb=new StringBuilder();
String line=null;
try {
while((line=br.readLine())!=null){
sb.append(line+"
");
}
is.close();
json=sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
jobj=new JSONObject(json);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jobj;
}
}
并且重要的是,如果我将其转换为apk文件并在设备中运行该apk文件,该设备曾用于调试该设备运行良好的应用程序(即该apk能够在设备上运行),但其他设备将无法运行(即它将无法打开或无法在设备上运行)
任何人都可以解决这个问题吗?
答案
在Proguard文件中添加此行
-keep class org.json.** { *;}
Proguard混淆了JSON Object类。在调试版本中,通常会禁用Proguard,因此不会发生此问题。
以上是关于JSON仅适用于Debug模式,但不适用于android中的apk文件的主要内容,如果未能解决你的问题,请参考以下文章
contentobserver 仅适用于插入和删除,但不适用于更新
加载 JSON 适用于 XMLHttpRequest 但不适用于 jQuery