如何在应用启动期间获取位置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在应用启动期间获取位置相关的知识,希望对你有一定的参考价值。
在我的应用中,我希望在应用启动期间获取当前位置。在我的主要活动(第一个活动)中,首先我获得位置(纬度和经度)并保存共享首选项。之后,我放置HomeFragment。当应用程序打开时我想看HomeFragment。在我的HomeFragment中,我希望获得sharedPrefreferences而不是使用位置和纬度信息来计算距离。但是,这不起作用,当我启动应用程序时,它会在保存SharePreferences之前放置HomeFragment。
这是我的MainActivity:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
MyLocation myLocation = new MyLocation(this);
myLocation.getLocation(this, locationResult);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.flContent, new HomeFragment());
tx.commit();
public MyLocation.LocationResult locationResult = new MyLocation.LocationResult() {
@Override
public void gotLocation(Location location) {
// TODO Auto-generated method stub
double Longitude = location.getLongitude();
double Latitude = location.getLatitude();
try {
System.out.println("lat"+Latitude);
System.out.println("long"+Longitude);
SharedPreferences locationpref = getApplication()
.getSharedPreferences("location", MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = locationpref.edit(); prefsEditor.commit();
prefsEditor.putString("Longitude", Longitude + "");
prefsEditor.putString("Latitude", Latitude + "");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
HomeFragment:
public class HomeFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
listView = (ListView) rootView.findViewById(R.id.list);
adapter = new CustomListAdapter(getActivity(), restaurantList);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Bundle bundle = new Bundle();
bundle.putString("restaurantId", String.valueOf(restaurantList.get(position).getId()));
MenuLineItemFragment fragment2 = new MenuLineItemFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.flContent, fragment2);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
SharedPreferences pref = getActivity().getApplication().getSharedPreferences("location", MODE_PRIVATE);
latitude = pref.getString("Latitude","");
longitude = pref.getString("Longitude","");
if(i==1){
request(); //I use longitude and latitude information in this method.
i++;
}
return rootView;
}
在我的清单文件中,我授予权限。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
如何在启动应用程序中获取当前位置?此外,如果用户的位置关闭,我该怎么办?
一些Location
类方法是在背景中完成的,例如getLongitude
和getLatitude
,因此无论是哪一行代码Fragment
初始化或getLocation
都无关紧要因为getLocation需要时间。
在你的代码中: -
你打电话给getLocation
> GPS在后台运行以获得位置> Fragment
得到初始化> getLocation
在background
完成并将返回的值传递给foreground
> gotLocation
被调用。
解决方案: -
第一种方法是在fragment
之后初始化gotLocation
,这根本不推荐。
第二种方法在sharedPrefreferences
中保存值并在gotLocation
完成时更新你的UI(片段)(可以使用进度条并在调用gotLocatienter code here
on后隐藏它)。
以上是关于如何在应用启动期间获取位置的主要内容,如果未能解决你的问题,请参考以下文章