Android (GPS 2 URL)
Недавно столкнулся с мыслью, а хорошо бы знать свои координаты на метсности. А еще лучше если бы об этих координатах знала бы система или сам Smart-House, но оставался вопрос как импортирвоать данные с телевона или планщета на сервер. Испробовав кучу софтин доступных в интернете и не найдя ничего хорошего пришлось наваяться свою первую софтину под Android. Обычно все начинают програмирование с «Hello World» я же начал с GPS и отправки данных. Короче говоря перешел в нападение без основ войны Android SDK. И так начнем…
Первое, что нам понадобится для реализации нашей программы, это Android SDK, оно благо доступно в свободном доступе и вы можете наслаждаться этим по ссылке http://developer.android.com/sdk/index.html#download
Скачав дистрибутив под свою систему (ЗЫ: мне пришлось работать в Убунту х64) поэтому пакет я выбирал http://dl.google.com/android/adt/adt-bundle-linux-x86_64.zip
Этот пакет уже имеет в себе систему компиляции и визуального программирования Eclipse
Распаковывем в удобное для вас место и запускаем сам эклипс.
Относительно самой программы: Я с ней работал уже давно когда занимался разработкой сервера от игры Lineage II. И многие функции мне уже были понятны. Но все равно это другое програмирование хоть и ява.
Сборку я производил для версии 17 — это вроде ведроид 4.1.*
Для запуска и проверки вам понадобится создать виртуальный девайс при запуске приложения вам будет доступен менеджер девайсов. Думаю тут проблем не возникнет.
Теперь о проекте:
1. Все, что нам нужно уже есть в SDK и ничего лишнего ставить не нужно.
2. Для доступа нам нужно разрешить доступ к оперделению локации и доступ в интернет.
3. Приложение должно показывать данные о локации, времени и иметь одну кнопку ALERT (вообще задумка для реализации «Emergency hot key» для разного рода задач).
4. Приложение должно отсылать на сервер по протоколу HTTP строку вида file.php?lat=0000000000&lon=00000000000&alt=000000000000&device=imei (Широта+Долгота+Высота+Имей телефона)
5. Приложение должно быть маленьким и БЕСПЛАТНЫМ 🙂
Опеределились… Поехали.
Создаем проект для Android.
Нам понадобится создать класс и файл GetAsyncTask.java
В него сразу прописываем
package com.data.gps2url; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.os.AsyncTask; import android.util.Log; @SuppressLint("NewApi") public class GetAsyncTask extends AsyncTask{ private static final int REGISTRATION_TIMEOUT = 3 * 1000; private static final int WAIT_TIMEOUT = 30 * 1000; private final HttpClient httpclient = new DefaultHttpClient(); final HttpParams params = httpclient.getParams(); HttpResponse response; private String content = null; private boolean error = false; private Context mContext; private int NOTIFICATION_ID = 1; private Notification mNotification; private NotificationManager mNotificationManager; public GetAsyncTask(Context context){ this.mContext = context; //Get the notification manager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); } protected void onPreExecute() { //createNotification("Data download is in progress",""); } protected String doInBackground(String... urls) { String URL = null; String param1 = "abc"; String param2 = "xyz"; try { //URL passed to the AsyncTask URL = urls[0]; HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT); HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT); ConnManagerParams.setTimeout(params, WAIT_TIMEOUT); HttpGet httpGet = new HttpGet(URL); //Any other parameters you would like to set //List nameValuePairs = new ArrayList (2); //nameValuePairs.add(new BasicNameValuePair("param1",param1)); //nameValuePairs.add(new BasicNameValuePair("param2",param2)); //httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs)); //Response from the Http Request response = httpclient.execute(httpGet); StatusLine statusLine = response.getStatusLine(); //Check the Http Request for success if(statusLine.getStatusCode() == HttpStatus.SC_OK){ ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); out.close(); content = out.toString(); } else{ //Closes the connection. Log.w("HTTP1:",statusLine.getReasonPhrase()); response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } } catch (ClientProtocolException e) { Log.w("HTTP2:",e ); content = e.getMessage(); error = true; cancel(true); } catch (IOException e) { Log.w("HTTP3:",e ); content = e.getMessage(); error = true; cancel(true); }catch (Exception e) { Log.w("HTTP4:",e ); content = e.getMessage(); error = true; cancel(true); } return content; } protected void onCancelled() { //createNotification("Error occured during data download",content); } protected void onPostExecute(String content) { if (error) { //createNotification("Data download ended abnormally!",content); } else { //createNotification("Data download is complete!",""); } } private void createNotification(String contentTitle, String contentText) { //Build the notification using Notification.Builder Notification.Builder builder = new Notification.Builder(mContext) .setSmallIcon(android.R.drawable.stat_sys_download) .setAutoCancel(true) .setContentTitle(contentTitle) .setContentText(contentText); //Get current notification mNotification = builder.getNotification(); //Show the notification mNotificationManager.notify(NOTIFICATION_ID, mNotification); } }
Если вам понадобится показывать уведомления в сроке состояния устройксва типа загрузка началась или ошибка загрузки декоментируйте строки
//createNotification(*******
Текст можете добавить свой.
Вызов класса производится через
new GetAsyncTask(this).execute("http://URL");
Дальше наша взяла… Привязываемся к GPS.
Это основной текст программы, думаю тут вам тоже будет все понятно, но на всякий случай ниже опишу, что к чему…
package com.data.gps2url; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.telephony.TelephonyManager; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class GPS extends Activity implements LocationListener { private LocationManager myManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gps); TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); myManager = (LocationManager) getSystemService(LOCATION_SERVICE); myManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); String getURL = "http://smart-home-url/file.php?trace=init&device="+getDeviceID(telephonyManager); //new MyAsyncTask(this).execute(getURL); new GetAsyncTask(this).execute(getURL); } public void send(View v) { TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String getURL = "http://smart-home-url/file.php?trace=alert&device="+getDeviceID(telephonyManager); //new MyAsyncTask(this).execute(getURL); new GetAsyncTask(this).execute(getURL); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_gps, menu); return true; } @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub TextView tx = (TextView) findViewById(R.id.textView1); TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); tx.setText("Широта: " + location.getLatitude() + "\nДолгота: " + location.getLongitude() + "\nВысота" + location.getAltitude() + "\nСкорость: " + location.getSpeed() + "\nТочность: "+location.getAccuracy()+"\nВремя спутника: "+location.getTime()+"\n"); String getURL = "http://smart-home-url/file.php?lat="+location.getLatitude()+"&lon="+location.getLongitude()+"&alt="+location.getAltitude()+"&acc="+location.getAccuracy()+"&time="+location.getTime()+"&device="+getDeviceID(telephonyManager); //new MyAsyncTask(this).execute(getURL); new GetAsyncTask(this).execute(getURL); } String getDeviceID(TelephonyManager phonyManager){ String id = phonyManager.getDeviceId(); return id; } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub TextView tx = (TextView) findViewById(R.id.textView1); tx.setText("GPS is disabled\n"); } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub TextView tx = (TextView) findViewById(R.id.textView1); tx.setText("Waiting... GPS\n"); Toast.makeText(this, "Status waiting...", Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub Toast.makeText(this, "Status Changed", Toast.LENGTH_SHORT).show(); } }
В программе есть еще один класс MyAsyncTask он выполнен также как и наш первый класс, но имеет раскоментированые поля для отправки POST данных.
На визуальном редакторе на проект добавлена кнопка и текстовое поле с именем TextView1 для отображения информации о GPS
Теперь о правах доступа приложения, они находятся в файле AndroidManifest.xml
Теперь запускаем наш проект и получаем в папке bin готовый APK файл для уставновки на ваше устройство.
Для вашего более удобного восприятия выкладываю свои исходники для ваших извращенств. 🙂
Будут вопросы пишите)