Я отправляю местоположение пользователя android пользователя lat и longitude на сервер вместе с registration ID
и другими параметрами как json
объект в Asynctask (вложенный класс активности). Но Расположение объекта (который имел значения в начале приложения) конкретизируется в деятельности как таковойОбъект Android Location возвращает null, когда я передаю его asyncTask
location = LocationServices.FusedLocationApi
.getLastLocation(mgoogleapiclient);
возвращается нуль в AsyncTask классе. Может кто-нибудь объяснить мне, почему? Должен ли я использовать отдельный класс, чтобы получить местоположение пользователя и отправить его в другую асинтезу или службу (что не имеет смысла с архитектурной точки зрения)?
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
PostData pdata = new PostData();
double latitude = mLastLocation.getLatitude();
double longitude = mLastLocation.getLongitude();
pdata.execute(String.valueOf(latitude), String.valueOf(longitude));
}
Я извлечение этого из класса AsyncTask как таковые:
json.put("latitude", String.valueOf(args[1]));
json.put("longitude", String.valueOf(args[2]));
Но когда я его отладку, я набираюсь получать регистрационный номер, который я послал к классу AsyncTask от другого метода. Надеюсь, я проясняю.
@Override
protected String doInBackground(String... args) {
try {
try {
URL url;
HttpURLConnection urlConn;
url = new URL ("myphp.php");
urlConn = (HttpURLConnection)url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestProperty("Content-Type","application/json");
urlConn.setRequestProperty("Accept", "application/json");
urlConn.setChunkedStreamingMode(0);
urlConn.setRequestMethod("POST");
urlConn.connect();
//get google account
AccountManager am = AccountManager.get(getBaseContext()); // "this" references the current Context
Account[] accounts = am.getAccountsByType("com.google");
//Create JSONObject here
JSONObject json = new JSONObject();
json.put("regID", String.valueOf(args[0]));
json.put("Google account", accounts[0].name);
json.put("name", "Amanda");
json.put("tel", "2069994444");
json.put("latitude", String.valueOf(args[1]));
json.put("longitude", String.valueOf(args[2]));
String postData=json.toString();
// Send POST output.
OutputStreamWriter os = new OutputStreamWriter(urlConn.getOutputStream(), "UTF-8");
os.write(postData);
Log.i("NOTIFICATION", "Data Sent");
os.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String msg="";
String line = "";
while ((line = reader.readLine()) != null) {
msg += line; }
Log.i("msg=",""+msg);
} catch (MalformedURLException muex) {
// TODO Auto-generated catch block
muex.printStackTrace();
} catch (IOException ioex){
ioex.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
Log.e("ERROR", "There is error in this code");
}
return null;
}
Ниже показано, как я послал регистрационный номер
gcm = GoogleCloudMessaging.getInstance(this);
regid = getRegistrationId(context);
if (!regid.isEmpty()) {
PostData pd = new PostData();
pd.execute(regid);
} else {
//register
registerInBackground();
}
'getLastLocation()', вероятно, возвращает null. Он делает это довольно часто. Зарегистрируйте слушателя и вызовите свою AsyncTask из обратного вызова 'onLocationChanged()'. –
@ Даниэль благодарит за ответ, но на данный момент мне не повезло. Могу ли я дважды позвонить в Asynctask, чтобы передать идентификатор и передать широту и долготу из двух разных методов? Как получить значения в методе doInBackground (String ... params)? –
У вас возникли проблемы с доступом к объекту JSONObject и Object в AsycTask? Пожалуйста, напишите свой код того, что вы пробовали до сих пор. Вы также можете посмотреть пример кода для регистрации приемника местоположения: http://stackoverflow.com/questions/30191047/access-coarse-location-permission-gives-a-cell-tower-precision-on-android/30315009 # 30315009 –