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 файл для уставновки на ваше устройство.

GPS2URL.tar

Для вашего более удобного восприятия выкладываю свои исходники для ваших извращенств. 🙂

Будут вопросы пишите)