am2 Posted June 14, 2015 Report Share Posted June 14, 2015 I want to use Identify Task in ARCGIS API for android.I used this example and it works fine but when I try to change the URL to get data from another WMS it shows error here is my another wms I get error in folowing line for (int index = 0; index < results.length; index++) { result_1 = results[index]; String displayFieldName = result_1.getDisplayFieldName(); Map<String, Object> attr = result_1.getAttributes(); for (String key : attr.keySet()) { if (key.equalsIgnoreCase(displayFieldName)) { resultList.add(result_1); } } } in this class which I have got from example package com.esri.arcgis.android.samples.identifytask; import java.util.ArrayList; import java.util.List; import java.util.Map; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.esri.android.action.IdentifyResultSpinner; import com.esri.android.action.IdentifyResultSpinnerAdapter; import com.esri.android.map.Callout; import com.esri.android.map.MapView; import com.esri.android.map.ags.ArcGISTiledMapServiceLayer; import com.esri.android.map.event.OnSingleTapListener; import com.esri.core.geometry.Envelope; import com.esri.core.geometry.Point; import com.esri.core.tasks.identify.IdentifyParameters; import com.esri.core.tasks.identify.IdentifyResult; import com.esri.core.tasks.identify.IdentifyTask; /** * This sample allows the user to identify data based on single tap and view the * results in a callout window which has a spinner in its layout. Also the user * can select any of the results displayed and view its details. The details are * the attribute values. * * The output value shown in the spinner is the display field. * */ public class Identify extends Activity { // create ArcGIS objects MapView mMapView = null; IdentifyParameters params = null; // create UI objects static ProgressDialog dialog; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Retrieve the map and initial extent from XML layout mMapView = (MapView) findViewById(R.id.map); // add demographic layer to the map mMapView.addLayer(new ArcGISTiledMapServiceLayer(this.getResources() .getString(R.string.identify_task_url_for_avghouseholdsize))); // set Identify Parameters params = new IdentifyParameters(); params.setTolerance(20); params.setDPI(98); params.setLayers(new int[] { 4 }); params.setLayerMode(IdentifyParameters.ALL_LAYERS); // Identify on single tap of map mMapView.setOnSingleTapListener(new OnSingleTapListener() { private static final long serialVersionUID = 1L; @Override public void onSingleTap(final float x, final float y) { if (!mMapView.isLoaded()) { return; } // Add to Identify Parameters based on tapped location Point identifyPoint = mMapView.toMapPoint(x, y); params.setGeometry(identifyPoint); params.setSpatialReference(mMapView.getSpatialReference()); params.setMapHeight(mMapView.getHeight()); params.setMapWidth(mMapView.getWidth()); params.setReturnGeometry(false); // add the area of extent to identify parameters Envelope env = new Envelope(); mMapView.getExtent().queryEnvelope(env); params.setMapExtent(env); // execute the identify task off UI thread MyIdentifyTask mTask = new MyIdentifyTask(identifyPoint); mTask.execute(params); } }); } private ViewGroup createIdentifyContent(final List<IdentifyResult> results) { // create a new LinearLayout in application context LinearLayout layout = new LinearLayout(this); // view height and widthwrap content layout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); // default orientation layout.setOrientation(LinearLayout.HORIZONTAL); // Spinner to hold the results of an identify operation IdentifyResultSpinner spinner = new IdentifyResultSpinner(this, results); // make view clickable spinner.setClickable(false); spinner.canScrollHorizontally(BIND_ADJUST_WITH_ACTIVITY); // MyIdentifyAdapter creates a bridge between spinner and it's data MyIdentifyAdapter adapter = new MyIdentifyAdapter(this, results); spinner.setAdapter(adapter); spinner.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); layout.addView(spinner); return layout; } /** * This class allows the user to customize the string shown in the callout. * By default its the display field name. * * A spinner adapter defines two different views; one that shows the data in * the spinner itself and one that shows the data in the drop down list when * spinner is pressed. * */ public class MyIdentifyAdapter extends IdentifyResultSpinnerAdapter { String m_show = null; List<IdentifyResult> resultList; int currentDataViewed = -1; Context m_context; public MyIdentifyAdapter(Context context, List<IdentifyResult> results) { super(context, results); this.resultList = results; this.m_context = context; } // Get a TextView that displays identify results in the callout. @Override public View getView(int position, View convertView, ViewGroup parent) { String LSP = System.getProperty("line.separator"); StringBuilder outputVal = new StringBuilder(); // Resource Object to access the Resource fields Resources res = getResources(); // Get Name attribute from identify results IdentifyResult curResult = this.resultList.get(position); if (curResult.getAttributes().containsKey( res.getString(R.string.NAME))) { outputVal.append("Place: " + curResult.getAttributes() .get(res.getString(R.string.NAME)).toString()); outputVal.append(LSP); } if (curResult.getAttributes().containsKey( res.getString(R.string.ID))) { outputVal.append("State ID: " + curResult.getAttributes() .get(res.getString(R.string.ID)).toString()); outputVal.append(LSP); } if (curResult.getAttributes().containsKey( res.getString(R.string.ST_ABBREV))) { outputVal.append("Abbreviation: " + curResult.getAttributes() .get(res.getString(R.string.ST_ABBREV)) .toString()); outputVal.append(LSP); } if (curResult.getAttributes().containsKey( res.getString(R.string.TOTPOP_CY))) { outputVal.append("Population: " + curResult.getAttributes() .get(res.getString(R.string.TOTPOP_CY)) .toString()); outputVal.append(LSP); } if (curResult.getAttributes().containsKey( res.getString(R.string.LANDAREA))) { outputVal.append("Area: " + curResult.getAttributes() .get(res.getString(R.string.LANDAREA)) .toString()); outputVal.append(LSP); } // Create a TextView to write identify results TextView txtView; txtView = new TextView(this.m_context); txtView.setText(outputVal); txtView.setTextColor(Color.BLACK); txtView.setLayoutParams(new ListView.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); txtView.setGravity(Gravity.CENTER_VERTICAL); return txtView; } } @Override protected void onPause() { super.onPause(); mMapView.pause(); } @Override protected void onResume() { super.onResume(); mMapView.unpause(); } private class MyIdentifyTask extends AsyncTask<IdentifyParameters, Void, IdentifyResult[]> { IdentifyTask task = new IdentifyTask(Identify.this.getResources() .getString(R.string.identify_task_url_for_avghouseholdsize)); IdentifyResult[] M_Result; Point mAnchor; MyIdentifyTask(Point anchorPoint) { mAnchor = anchorPoint; } @Override protected void onPreExecute() { // create dialog while working off UI thread dialog = ProgressDialog.show(Identify.this, "Identify Task", "Identify query ..."); } protected IdentifyResult[] doInBackground(IdentifyParameters... params) { // check that you have the identify parameters if (params != null && params.length > 0) { IdentifyParameters mParams = params[0]; try { // Run IdentifyTask with Identify Parameters M_Result = task.execute(mParams); } catch (Exception e) { e.printStackTrace(); } } return M_Result; } @Override protected void onPostExecute(IdentifyResult[] results) { // dismiss dialog if (dialog.isShowing()) { dialog.dismiss(); } ArrayList<IdentifyResult> resultList = new ArrayList<IdentifyResult>(); IdentifyResult result_1; for (int index = 0; index < results.length; index++) { result_1 = results[index]; String displayFieldName = result_1.getDisplayFieldName(); Map<String, Object> attr = result_1.getAttributes(); for (String key : attr.keySet()) { if (key.equalsIgnoreCase(displayFieldName)) { resultList.add(result_1); } } } Callout callout = mMapView.getCallout(); callout.setContent(createIdentifyContent(resultList)); callout.show(mAnchor); } } } and this is error 06-11 19:01:21.384 18989-18989/com.tehranuni.hazard.hazard E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.tehranuni.hazard.hazard, PID: 18989 java.lang.NullPointerException: Attempt to get length of null array at com.tehranuni.hazard.hazard.gatter_geo_data$MyIdentifyTask.onPostExecute(gatter_geo_data.java:714) at com.tehranuni.hazard.hazard.gatter_geo_data$MyIdentifyTask.onPostExecute(gatter_geo_data.java:661) at android.os.AsyncTask.finish(AsyncTask.java:632) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:211) at android.app.ActivityThread.main(ActivityThread.java:5321) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:117) As the error say results is null and I think it is because it does not get fields from WMS layer.What so you think about this error?Is there any way to fix it? Thank you so much for your help 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.