onActivityResult () не вызывается (MapFragment) - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь сделать так, чтобы приложение моей карты перенаправляло к настройкам разрешений местоположения, и как только разрешения были предоставлены, перенаправьте приложение снова. по какой-то причине мой onActivityResult даже не вызывается после запуска действия. и, в основном, что происходит, когда я нажимаю на появившуюся кнопку действия панели быстрого запуска, она запускает settingsIntent и перенаправляет меня к настройкам, но активность не переходит в состояние результата, а onActivityResult никогда не вызывается для каких-либо предложений?

вот код:

class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

private lateinit var mMap: GoogleMap

 private fun checkPermissions(): Boolean {
        //returns true if granted permission for location
        var checker = ActivityCompat.checkSelfPermission(
            applicationContext,
            android.Manifest.permission.ACCESS_COARSE_LOCATION
        ) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
            applicationContext,
            android.Manifest.permission.ACCESS_FINE_LOCATION
        ) == PackageManager.PERMISSION_GRANTED
        if (checker) {
            Log.d(TAG, "granted Permissions")
        } else {
            Log.d(TAG, "no Permissions granted")
        }
        return checker
    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun requestPermissions() {
        requestPermissions(
            arrayOf(
                android.Manifest.permission.ACCESS_COARSE_LOCATION,
                android.Manifest.permission.ACCESS_FINE_LOCATION
            ), PERMISSION_ID

        )

    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (!checkPermissions()) {
            Snackbar.make(
                    map.view!!,
                    "Please Enable Location Permission",
                    Snackbar.LENGTH_INDEFINITE
                ).setAction("Enable Location",
                    View.OnClickListener {
                        var settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
                        startActivityForResult(settingsIntent, 1)


                    })
                .show()
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        Log.d(TAG, "Redirected to settings for Location Permissions ")
        if (resultCode == Activity.RESULT_OK) {
            if (checkPermissions()) {
                Log.d(TAG, "Permissions granted from settings")
                startActivity(Intent(this, MapsActivity::class.java))
            }
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        Log.d(TAG, "onCreate called")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_maps)
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)


    }

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onMapReady(googleMap: GoogleMap) {
        Log.d(TAG, "omMapReady:starts")
        mMap = googleMap
        requestPermissions()

    }

манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.burgertracker">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />


        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

    </application>

</manifest>

Ответы [ 3 ]

0 голосов
/ 24 марта 2020

Это работает для меня,

MainActivity

import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<TextView>(R.id.tv_click).setOnClickListener {
            val settingsIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
            startActivityForResult(settingsIntent, 1)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Toast.makeText(this, "Hakuna Mattat", Toast.LENGTH_SHORT).show()
    }
}

activity_main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.demointentapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Я перехожу на страницу настроек, когда нажимаю TextView на MainActivity и когда я нажимаю обратно со страницы настроек, я вижу Toast сообщение Hakuna Mattat каждый раз.

0 голосов
/ 24 марта 2020

между нашими кодами есть некоторые различия, ваш код находится на обычном действии, а мой - на mapActivity, в котором отображается фрагмент карты. Я запускаю startActivityForResult из своей функции onRequestPermissiosnResult, так как мне нужно запускать только в том случае, если разрешения не предоставлены .. поэтому, я думаю, что любая из них должна быть причиной ... также я проверил, и onActivityResult вызывается только при нажатии назад после отображения настроек местоположения ... но проблема в том, что Мне нужно нажать на приложение на этой странице настроек местоположения, а затем разрешить местоположение для него, и если я сделаю это, а затем нажать кнопку «Домой» 2 раза, чтобы go вернуть приложение, оно не go назад и onActivityResult не вызывается .. так что либо мне нужно знать, есть ли возможность запустить намерение, которое запустит действие, которое переходит непосредственно к моим указанным c настройкам местоположения приложения, а затем я предполагаю, что это будет работать, или либо я буду знать, как контролировать активность настроек, потому что после перехода к настройкам mapAcitivty останавливается ..

0 голосов
/ 23 марта 2020
int PERMISSION_ID = 44;
FusedLocationProviderClient mFusedLocationClient;

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.setContentView(R.layout.activity_home);

            mFusedLocationClient = 
            LocationServices.getFusedLocationProviderClient(this);

                    getLastLocation();



    }

private boolean checkPermissions() {
    if (ActivityCompat.checkSelfPermission(HomeActivity.this, 
 Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(HomeActivity.this, 
 Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        return true;
    }
    return false;
}

private void requestPermissions() {
    ActivityCompat.requestPermissions(
            HomeActivity.this,
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
            PERMISSION_ID
    );
}


private boolean isLocationEnabled() {
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(
            LocationManager.NETWORK_PROVIDER
    );
}


@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressLint("MissingPermission")
private void getLastLocation() {
    if (checkPermissions()) {
        if (isLocationEnabled()) {
            mFusedLocationClient.getLastLocation().addOnCompleteListener(
                    new OnCompleteListener<Location>() {
                        @Override
                        public void onComplete(@NonNull Task<Location> task) {
                            Location location = task.getResult();
                            if (location == null) {
                                requestNewLocationData();
                            } else {


                                Geocoder geocoder = new Geocoder(HomeActivity.this, Locale.getDefault());
                                List<Address> addresses = null;
                                try {
                                    addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }


                                assert addresses != null;

                                if (addresses != null) {

                                    String cityName = addresses.get(0).getAddressLine(0);
                                    String stateName = addresses.get(0).getAddressLine(1);
                                    String countryName = addresses.get(0).getAddressLine(2);

                                    String[] arrOfStr = cityName.split(",");


                                    locationTV.setText("You're in " + arrOfStr[arrOfStr.length - 2] + ", " + arrOfStr[arrOfStr.length - 1]);
                                }

                            }
                        }
                    }
            );
        } else {
            Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
    } else {
        requestPermissions();
    }
}


@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSION_ID) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getLastLocation();
        }
    }
}

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onResume() {
    super.onResume();
    if (checkPermissions()) {
        getLastLocation();
    }

}


@SuppressLint("MissingPermission")
private void requestNewLocationData() {

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(0);
    mLocationRequest.setFastestInterval(0);
    mLocationRequest.setNumUpdates(1);

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.requestLocationUpdates(
            mLocationRequest, mLocationCallback,
            Looper.myLooper()
    );

}

private LocationCallback mLocationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        Location mLastLocation = locationResult.getLastLocation();
        Geocoder geocoder = new Geocoder(HomeActivity.this, Locale.getDefault());
        List<Address> addresses = null;
        try {
            addresses = geocoder.getFromLocation(mLastLocation.getLatitude(), mLastLocation.getLongitude(), 1);
        } catch (IOException e) {
            e.printStackTrace();
        }

        assert addresses != null;


        if (addresses != null) {


            String cityName = addresses.get(0).getAddressLine(0);
            String stateName = addresses.get(0).getAddressLine(1);
            String countryName = addresses.get(0).getAddressLine(2);

            String[] arrOfStr = cityName.split(",");


            locationTV.setText("You're in " + arrOfStr[arrOfStr.length - 2] + ", "  + 
            arrOfStr[arrOfStr.length - 1]);

        }


    }


};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...