Журнал LinuxFormat - перейти на главную

LXF162:Android

Материал из Linuxformat
Версия от 01:57, 10 октября 2018; Olkol (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск


» Программирование Наладим взаимодействие Android и Google Android:

Фо­то на кар­те

LXF111.tut_adv.jkemp.psd Наш эксперт

Джуль­ет­та Кемп пи­шет ста­тьи для раз­лич­ных из­да­ний и сей­час ду­ма­ет над тем, как бы вос­поль­зо­вать­ся HTTP-под­клю­че­ни­ем сво­его те­ле­фо­на к сер­ве­ру.

Ин­фор­ма­ция о ме­сто­по­ло­же­нии

Ин­фор­ма­ция о ме­сто­по­ло­жении вклю­ча­ет не толь­ко ши­ро­ту и дол­го­ту, но и ку­чу дру­гих па­ра­мет­ров. Для досту­па к ним есть несколь­ко ме­то­дов в клас­се Location, а для их пред­став­ления в че­ло­ве­ко-чи­тае­мом ви­де при­го­дит­ся ме­тод toString() – ре­зуль­тат по­лу­чит­ся при­мер­но та­кой:

Location[mProvider=gps,mTime=1339624800000,

mLatitude=55.0, mLongitude=0.0,mHasAltitude=true,

mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,

mHasBearing=false,mBearing=0.0,mHasAccuracy=

false,mAccuracy=0.0,mExtras= Bundle[mParcelledData.dataSize=4]]

Вот пол­ная ин­фор­ма­ция об этих па­ра­мет­рах:

» Provider – про­вай­дер ме­сто­по­ло­жения, обыч­ные зна­чения – GPS или Network [Сеть]. » Time – вре­мя съем­ки по Грин­ви­чу (в мил­ли­се­кун­дах с 1 ян­ва­ря 1970 го­да). » Latitude и Longitude – как сле­ду­ет из на­звания, ши­ро­та и дол­го­та в гра­ду­сах. » hasAltitude, Altitude – ес­ли при­вяз­ка со­дер­жит ин­фор­ма­цию о вы­со­те над уровнем мо­ря (т. е. ес­ли hasAltitude рав­но true), Altitude со­дер­жит вы­со­ту в мет­рах. » hasSpeed, Speed – ес­ли при­вяз­ка со­дер­жит ин­фор­ма­цию о ско­ро­сти, зна­чение Speed бу­дет нену­ле­вым. По умол­чанию ин­фор­ма­ции о ско­ро­сти не со­дер­жит­ся. » hasBearing, Bearing – ес­ли при­вяз­ка со­дер­жит ин­фор­ма­цию об ази­му­те, Bearing со­дер­жит на­прав­ление дви­жения в гра­ду­сах к восто­ку от гео­гра­фи­че­­ско­­го се­ве­ра. На эму­ля­то­ре этих дан­ных нет, но на ре­аль­ном уст­рой­ст­ве они бы­ва­ют. » hasAccuracy, Accuracy – ес­ли у про­вай­де­ра есть дан­ные о точ­но­сти, Accuracy со­дер­жит зна­чение до­пуска в мет­рах. » Extras со­дер­жит всю до­полнитель­ную ин­фор­ма­цию о при­вяз­ке в ви­де пар «имя/зна­чение». Одним из та­ких па­ра­мет­ров мо­жет быть чис­ло спутников, ис­поль­зо­ван­ное для по­лу­чения при­вяз­ки. Пол­ная стро­ка с па­ра­мет­ра­ми рас­по­ло­жения не слиш­ком по­лез­на про­грам­ме, за­то очень по­лез­на про­грам­ми­сту. На­при­мер, с по­мо­щью па­ра­мет­ра Bearing мож­но со­ри­ен­ти­ро­вать стрел­ку на кар­те (так­же есть ме­тод bearingTo(), ко­то­рый воз­вра­ща­ет на­прав­ление для за­дан­ной конеч­ной точ­ки).

Ес­ли имеется точ­ная ин­фор­ма­ция о вы­со­те, то ее мож­но за­пи­сы­вать че­рез оп­ре­де­лен­ные ин­тер­ва­лы вре­мени, что­бы от­сле­жи­вать свой подъ­ем – это осо­бен­но удоб­но при ез­де на ве­ло­си­пе­де.

Джуль­ет­та Кемп пи­шет про­стую про­грам­му, ко­то­рая при­вя­жет фо­то­гра­фии к Google Maps с GPS.

На этом уро­ке мы рас­смот­рим ин­тер­фейс GPS, а так­же вернем­ся к неко­то­рым дру­гим ком­понен­там сис­те­мы, ис­поль­зо­ван­ным в наших пре­ды­ду­щих стать­ях – API кар­ты [Map], ба­зы дан­ных [Database] и ка­ме­ры [Camera]. Под­роб­но этот код мы раз­би­рать не бу­дем, но весь он присутст­вует на DVD, по­это­му при необ­хо­ди­мо­сти его мож­но ско­пи­ро­вать, вста­вить и за­ста­вить ра­бо­тать (об­ра­ти­те внимание, что код, помещенный на DVD, не ском­пи­ли­ру­ет­ся в том виде, как он есть – нуж­но соз­дать но­вый про­ект, вруч­ную или в Eclipse, и им­пор­ти­ро­вать его).

Шаг 1: Ба­зо­вая на­строй­ка GPS

Ин­тер­фейс на­ше­го при­ло­жения прост: тес­то­вое по­ле (в ко­то­ром бу­дет по­ка­за­но ме­сто­по­ло­жение по­сле его оп­ре­де­ления) и три кноп­ки: Get Location [Оп­ре­де­лить ме­сто­по­ло­жение], Take Photo [Сде­лать снимок] и Show Map of Photos [По­ка­зать кар­ту с фо­то­гра­фия­ми]. На DVD най­ди­те XML-файл res/layout/main.xml. Пер­вые несколь­ко ме­то­дов в на­шем GPSPhoto вы­гля­дят так:

private LocationManager lm; private TextView locationText;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

setUpButtons();

locationText = (TextView) findViewById(R.id.location);

lm = (LocationManager) getSystemService(LOCATION_SERVICE);

}

public void setUpButtons() {

Button getLocationButton = (Button) findViewById (R.id.button_getlocation);

getLocationButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {

getCurrentLocation();

}

});

}

За­дание объ­ек­та LocationManager в ме­то­де onCreate() по­зво­лит нам ра­бо­тать с раз­лич­ны­ми про­вай­де­ра­ми и па­ра­мет­ра­ми ме­сто­по­ло­жения. С его по­мо­щью мы по­лу­ча­ем про­вай­дер ме­сто­по­ло­жения и те­ку­щее ме­сто­по­ло­жение в ме­то­де getCurrentLocation():

public void getCurrentLocation() {

LocationListener locationListener = new LocationListener() {

public void onLocationChanged(Location location) {

locationText.setText(location.toString());

lm.removeUpdates(this);

}

public void onStatusChanged(String provider, int status, Bundle extras) {}

public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider){}

};

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

Location lastKnownLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

if (lastKnownLocation != null) {

locationText.setText(lastKnownLocation.toString());

} else {

locationText.setText(“По­след­нее ме­сто­по­ло­же­ние не по­лу­чить”);

}

}

LocationListener, как мож­но до­га­дать­ся по на­званию, от­сле­жи­ва­ет из­менения ме­сто­по­ло­жения и, за­ме­тив та­ко­вое, за­пуска­ет ме­тод onLocationChanged(). Когда ме­сто­по­ло­жение ме­ня­ет­ся, мы уста­нав­ли­ва­ем зна­чение тек­сто­во­го по­ля [TextView] locationText в стро­ко­вое зна­чение GPS. Ос­таль­ные ме­то­ды LocationListener несу­ще­ст­вен­ны – по­ка оста­вим их пусты­ми.

По соз­дании LocationListener его нуж­но за­ре­ги­ст­ри­ро­вать в LocationManager и вы­брать про­вай­де­ра. Здесь мы поль­зу­ем­ся про­вай­де­ром GPS (ес­ли он недосту­пен, об­ра­бот­ку ошиб­ки см. да­лее). Что­бы восполь­зо­вать­ся про­вай­де­ром GPS, так­же нуж­но уста­но­вить сле­дую­щие пра­ва досту­па в AndroidManifest.xml:

<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />

Иногда на по­лу­чение ин­фор­ма­ции о ме­сто­по­ло­жении ­тре­бует­ся вре­мя – в процессе ожидания мож­но, если удастся, по­лу­чить по­следнее из­вест­ное ме­сто­по­ло­жение вруч­ную и ис­поль­зо­вать его, по­ка LocationListener не опо­вес­тит нас о сле­дую­щем.

Ес­ли вы­полнить этот код, у нас получится ре­зуль­тат сле­дую­щего вида:

Location[mProvider=gps,mTime=1338588000000, mLatitude=37.422005,mLongitude=-122.084095,

mHasAltitude=true,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=false, mAccuracy=0.0,mExtras=Bundle[mParcelledData.dataSize=4]]

Здесь немало па­ра­мет­ров, ко­то­рые мо­гут нам при­го­дить­ся – под­роб­но­сти см. во врез­ке «Информация о местоположениии». Вы­та­щим от­сю­да ши­ро­ту и дол­го­ту и вы­ве­дем их с тре­мя зна­ка­ми по­сле за­пя­той с по­мо­щью клас­са DecimalFormat. Для это­го за­меним вы­зов setText() та­ким ко­дом:

DecimalFormat latLngFormat = new DecimalFormat(“#.###”);

String lat = Double.toString(Double.valueOf(latLngFormat.format(currentLocation.getLatitude())));

String lng = Double.toString(Double.valueOf(latLngFormat.format(currentLocation.getLongitude()))); locationText.setText(“Шир: “ + lat + “, долг: “ + lng);

От­правь­те од­но зна­чение пе­ред пе­ре­за­груз­кой эму­ля­то­ра, за­тем на­жми­те на кноп­ку Get Location и от­правь­те еще од­но, и вы уви­ди­те, как зна­чение из­менит­ся. Ес­ли вы сде­лае­те это еще раз, зна­чение ме­нять­ся не бу­дет, так как лис­тенер вы­клю­чен. Конеч­но, мож­но оста­вить его вклю­чен­ным, но это до­воль­но бы­ст­ро раз­ря­дит ба­та­рею, по­это­му луч­ше вы­клю­чать и сно­ва вклю­чать его при необ­хо­ди­мо­сти. В на­шем слу­чае – при ка­ж­дом вы­зо­ве getCurrent Location(), т. е. при на­жа­тии кноп­ки или при съем­ке фо­то­гра­фии.

Персональные инструменты
купить
подписаться
Яндекс.Метрика