i trying user location weather app. unable , have tried follow both google last known location guide, https://guides.codepath.com/android/retrieving-location-with-locationservices-api.
import android.manifest; import android.content.context; import android.content.pm.packagemanager; import android.graphics.drawable.drawable; import android.location.location; import android.net.connectivitymanager; import android.net.networkinfo; import android.os.bundle; import android.support.annotation.nonnull; import android.support.annotation.nullable; import android.support.v4.app.activitycompat; import android.support.v7.app.appcompatactivity; import android.util.log; import android.view.view; import android.widget.imageview; import android.widget.progressbar; import android.widget.textview; import android.widget.toast; import com.google.android.gms.common.connectionresult; import com.google.android.gms.common.api.googleapiclient; import com.google.android.gms.location.locationrequest; import com.google.android.gms.location.locationservices; import org.json.jsonexception; import org.json.jsonobject; import java.io.ioexception; import butterknife.bindview; import butterknife.butterknife; import okhttp3.call; import okhttp3.callback; import okhttp3.okhttpclient; import okhttp3.request; import okhttp3.response; public class mainactivity extends appcompatactivity implements googleapiclient.connectioncallbacks, googleapiclient.onconnectionfailedlistener { public static final string tag = mainactivity.class.getsimplename(); public currentweather mcurrentweather; private googleapiclient mgoogleapiclient; private locationrequest mlocationrequest; double latitude; double longitude; @bindview(r.id.timelabel) textview mtimelabel; @bindview(r.id.temperaturelabel) textview mtemperaturelabel; @bindview(r.id.humidityvalue) textview mhumidityvalue; @bindview(r.id.precipvalue) textview mprecipvalue; @bindview(r.id.summarytextview) textview msummarylabel; @bindview(r.id.iconimageview) imageview miconimageview; @bindview(r.id.refreshimageview) imageview mrefreshimageview; @bindview(r.id.progressbar) progressbar mprogressbar; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mgoogleapiclient = new googleapiclient.builder(this) .addapi(locationservices.api) .addconnectioncallbacks(this) .addonconnectionfailedlistener(this).build(); // import view variables butterknife.bind(this); // set default progressbar invisible mprogressbar.setvisibility(view.invisible); // create onclick refresh button mrefreshimageview.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { getforecast(latitude, longitude); } }); getforecast(latitude, longitude); } @override protected void onstart() { super.onstart(); mgoogleapiclient.connect(); } @override protected void onstop() { if (mgoogleapiclient != null) { mgoogleapiclient.disconnect(); } super.onstop(); } @override public void onconnected(@nullable bundle bundle) { if (activitycompat.checkselfpermission(this, manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) { // todo: consider calling // activitycompat#requestpermissions // here request missing permissions, , overriding // public void onrequestpermissionsresult(int requestcode, string[] permissions, // int[] grantresults) // handle case user grants permission. see documentation // activitycompat#requestpermissions more details. return; } location mcurrentlocation = locationservices.fusedlocationapi.getlastlocation(mgoogleapiclient); if(mcurrentlocation != null){ log.d("debug", "current location: " + mcurrentlocation.tostring()); latitude = mcurrentlocation.getlatitude(); longitude = mcurrentlocation.getlongitude(); } } @override public void onconnectionsuspended(int i) { if (i == cause_service_disconnected) { toast.maketext(this, "disconnected. please re-connect.", toast.length_short).show(); } else if (i == cause_network_lost) { toast.maketext(this, "network lost. please re-connect.", toast.length_short).show(); } }
what trying achieve lat , long coordinates , save them global variables later used when making call getforecast()
.
androidmanifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.leetinsider.skymate" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" /> <application android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".mainactivity" android:screenorientation="portrait"> <intent-filter> <action android:name="android.intent.action.main"/> <category android:name="android.intent.category.launcher"/> </intent-filter> </activity> </application> </manifest>
try following solution:
first, make sure have implemented correct locationlistener interface in activity class:
com.google.android.gms.location.locationlistener
then request appropriate permissions support android devices running v6.0
private static final int my_permission_request_read_coarse_location = 102;
then request permission:
@override public void onconnected(@nullable bundle bundle) { // version of android using? // answer = 6.0 if (activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted ) { activitycompat.requestpermissions(thisactivity, new string[]{manifest.permission.access_coarse_location}, my_permission_request_read_coarse_location); } location mcurrentlocation = locationservices.fusedlocationapi.getlastlocation(mgoogleapiclient); if (mcurrentlocation != null) { log.d(tag, "current location: " + mcurrentlocation.tostring()); latitude = mcurrentlocation.getlatitude(); longitude = mcurrentlocation.getlongitude(); } startlocationupdates(); }
to results permission requests @ runtime, override method:
@override public void onrequestpermissionsresult(int requestcode, string permissions[], int[] grantresults) { switch (requestcode) { case my_permission_request_read_coarse_location:~~~~~~~~~~~ // if request cancelled, result arrays empty. if (grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted) { // permission granted, yay! // contacts-related task need do. } else { // permission denied, boo! disable // functionality depends on permission. } break; } // other 'case' lines check other // permissions app might request } }
then, method update location:
protected void startlocationupdates() { mlocationrequest = locationrequest.create() .setpriority(locationrequest.priority_high_accuracy) .setinterval(update_interval) .setfastestinterval(fastest_interval); if (activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) { //request permission here above return; } //there problem here because locationlistener cast activity locationservices.fusedlocationapi.requestlocationupdates(mgoogleapiclient, mlocationrequest, this); }
this should it;
happy coding!
Comments
Post a Comment