Saya ingin pengguna yang memulai aplikasi untuk pertama kali di perangkat dapat mengakses data GPS di sesi itu. Saat ini, pengguna harus menutup dan kemudian memulai ulang aplikasi setelah memberikan izin lokasi agar data lokasi ditampilkan di aplikasi. Saya telah mencoba berbagai metode untuk menyelesaikan ini. Baru-baru ini, saya telah memindahkan requestPermission ke Fragment1 yang juga merupakan lokasi locationManager.

public class Fragment1 extends Fragment {
public static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.data_capture, container, false);
    requestPermission(v);
    permissionAssessment(v);
...
return (v);
}


public void requestPermission(View v) {//This works, only poulates after restart...
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_FINE_LOCATION);
        //conditional here so that if conditionals granted do below, if refused, go away...
    }else{
        mGpsLocationListener = new GpsLocationListener();
        lm = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
        mGpsStatus = lm.getGpsStatus(mGpsStatus);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, mGpsLocationListener);
    }
}   

Selain itu, saya mengambil pendekatan manusia gua, dan membuat "permissionAssessment()" yang akan berjalan segera setelah requestPermission() dengan asumsi bahwa mungkin karena izin kemungkinan diberikan oleh pengguna di requestPermission(), saya dapat menjalankan checkSelfPermission dan memaksa layanan lokasi untuk memulai dengan cara itu. Tidak ada cerutu. Lihat di bawah.

  public void permissionAssessment(View v){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
    if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
        mGpsLocationListener = new GpsLocationListener();
        lm = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
        mGpsStatus = lm.getGpsStatus(mGpsStatus);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, mGpsLocationListener);
    }
}

Perhatikan bahwa permissionAssessment() berfungsi dengan baik jika perangkat sudah memiliki izin ACCESS_FINE_LOCATION yang diberikan. Itu tidak berfungsi mengikuti izin yang baru diinstal dari requestPermission() saat itu digunakan dan tidak ada izin yang sudah ada sebelumnya pada perangkat.

Selanjutnya, fyi aplikasi ini dimulai pada tab yang terkait dengan Fragmen1 dan terus-menerus memperbarui waktu satelit gps yang ditampilkan. Data satelit/GPS menunjukkan baik SETELAH aplikasi dimulai ulang setelah sesi di mana pengguna memberikan izin lokasi. Saya lebih suka GPS "go-live" di sesi di mana pengguna menetapkan izin. Saran yang membangun akan dihargai. Terima kasih sebelumnya.

0
portsample 11 Mei 2021, 00:49

1 menjawab

Jawaban Terbaik

Selain itu, saya mengambil pendekatan manusia gua, dan membuat "permissionAssessment()" yang akan segera berjalan setelah requestPermission() dengan asumsi bahwa mungkin karena izin kemungkinan diberikan oleh pengguna di requestPermission().

Pendekatan ini tidak akan bekerja pertama kali ketika izin diberikan oleh pengguna. Ini karena prompt ditampilkan kepada pengguna untuk meminta izin menggunakan ActivityCompat.requestPermissions(...). Pemberian/penolakan izin yang sebenarnya akan dilakukan pada tahap selanjutnya ketika pengguna berinteraksi dengan prompt.

Ini berarti bahwa fungsi permissionAssessment(...) yang segera dijalankan setelah ActivityCompat.requestPermission(...) tidak akan memiliki izin sehingga tidak akan berhasil dijalankan untuk pertama kalinya dan akan memerlukan "reload" Fragmen.

Untuk memastikan proses berjalan dengan sukses, Anda harus memanggil permissionAssessment(...) dalam panggilan balik "sukses" dari ActivityCompat.requestPermission(...). Ini dilakukan dengan menggunakan fungsi onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults).

Inilah implementasi saya: -

public class Fragment1 extends Fragment {
public static final int REQUEST_FINE_LOCATION_CODE = 1;
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.data_capture, container, false);

    permissionAssessment(v);

...
return (v);
}


public void permissionAssessment(View v){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);

    if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
        // Permission is granted, proceed to get location.
        getLocation()
    } else {
        // Permission is not granted, request permissions.
        // Only the prompt is shown here, nothing else will happen.
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_FINE_LOCATION_CODE);
    }
}
    
/**
 * This Function is responsible for handling what happens when permissions are granted by the user.
 */
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    if (requestCode == REQUEST_FINE_LOCATION_CODE) {

        if (grantResults.length > 0) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                
                // Permissions Granted!
                // Get Location as soon as the permissions are granted.
                getLocation();
            }
        } else {
                
            // Permission Denied by the user
            // Show a prompt or do nothing as per your use case.
        }
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}


public void getLocation() {
    mGpsLocationListener = new GpsLocationListener();
    lm = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
    mGpsStatus = lm.getGpsStatus(mGpsStatus);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, mGpsLocationListener);
}

Silakan merujuk ke ini

0
Sasaki 12 Mei 2021, 06:32