如何在应用启动期间获取位置

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类方法是在背景中完成的,例如getLongitudegetLatitude,因此无论是哪一行代码Fragment初始化或getLocation都无关紧要因为getLocation需要时间。

在你的代码中: -

你打电话给getLocation> GPS在后台运行以获得位置> Fragment得到初始化> getLocationbackground完成并将返回的值传递给foreground> gotLocation被调用。

解决方案: -

第一种方法是在fragment之后初始化gotLocation,这根本不推荐。

第二种方法在sharedPrefreferences中保存值并在gotLocation完成时更新你的UI(片段)(可以使用进度条并在调用gotLocatienter code hereon后隐藏它)。

以上是关于如何在应用启动期间获取位置的主要内容,如果未能解决你的问题,请参考以下文章

在应用启动期间获取当前位置

如何从 Firebase 获取数据到 Recyclerview 中的片段?

在选项卡式应用程序中的何处放置位置代码?

如何在棉花糖中首次启动应用程序时获取位置访问权限

ForYouFragment 片段不更新

如何在android的地图中获取当前位置?