اذهب إلى المحتوى

السؤال

نشر

مرحبا اخواني الكرام

اعمال على نظام خرائط وهو شغال ميه ميه ولكن توجد مشكله واجهتني بعد طلب اذونات تشفيل GPS وذهاب الى اعدادات الهاتف وتشغيل نظام GPS بطبيعة الحال اعمل رجوع الى الاكتفي من خلال زر الرجوع بعد تشغيل GPS المشكله بعد من ارجع للاكتفتي الاكتفي الاكتفي هنا لا يعمل تحديث الى نفسه بصراحه انا مطور تطبيقات جديد ولا اعلم اذا كان وصفي صحيح هاكذا ولكن الفكرة المطلوبه بعد تشغيل GPS ورجوع الى الاكتفتي  المفترض احصل على قيمة Longitude and latitude ولكن هذا لا يحدث من اجل ان يحدث احتاج الرجوع الى صفحة main activity واعادة الدخول الى هذا الاكتفتي حتى اجد القيمة

الكود الي شغال عليه كالتالي:  

 

public class SendMapLactiontest extends AppCompatActivity implements OnMapReadyCallback {



    private static final String TAG = SendMapLactiontest.class.getSimpleName();
    private GoogleMap mMap;

    LocationManager locationManager;
    private CameraPosition mCameraPosition;


    private PlacesClient mPlacesClient;


    private FusedLocationProviderClient mFusedLocationProviderClient;

    private final LatLng mDefaultLocation = new LatLng(-33.8523341, 151.2106085);
    private static final int DEFAULT_ZOOM = 15;


    private Location mLastKnownLocation;


    private static final String KEY_CAMERA_POSITION = "camera_position";
    private static final String KEY_LOCATION = "location";


    private static final int M_MAX_ENTRIES = 5;

    EditText textLatitude,textLongitude,lonTextView,lonTextView1;
    Button button,btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            mLastKnownLocation = savedInstanceState.getParcelable(KEY_LOCATION);
            mCameraPosition = savedInstanceState.getParcelable(KEY_CAMERA_POSITION);
        }

        setContentView(R.layout.map_send_lcation);
        textLatitude=findViewById(R.id.textLatitude);
        textLongitude=findViewById(R.id.textLongitude);
        lonTextView =findViewById(R.id.tap_text1);
        lonTextView1 =findViewById(R.id.tap_text);

        String apiKey = getString(R.string.google_map_api_key);
        Places.initialize(getApplicationContext(), apiKey);
        mPlacesClient = Places.createClient(this);

        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);mapFragment.getMapAsync(this);



        if(!isLocationEnabled()) {
            AlertDialog.Builder builder = new AlertDialog.Builder(SendMapLactiontest.this);
            builder.setTitle("R.string.network_not_enabled")
                    .setMessage("R.string.open_location_settings")
                    .setPositiveButton("R.string.yes",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));

                                }
                            })
                    .setNegativeButton("R.string.cancel",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                    Intent imgListIntent = new Intent(SendMapLactiontest.this, AddNewItem.class);
                                    startActivity(imgListIntent);
                                    finish();
                                }
                            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (mMap != null) {
            outState.putParcelable(KEY_CAMERA_POSITION, mMap.getCameraPosition());
            outState.putParcelable(KEY_LOCATION, mLastKnownLocation);
            super.onSaveInstanceState(outState);
        }
    }



    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        mMap.clear();


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            if (ActivityCompat.checkSelfPermission
                    (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    &&
                    ActivityCompat.checkSelfPermission
                            (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            {
                requestPermissions(new String[]{
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.ACCESS_FINE_LOCATION
                }, 1); // 1 is requestCode
                return;

            }
        }else{


        }







        getDeviceLocation();
        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);







    }

    protected boolean isLocationEnabled(){
        String le = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) getSystemService(le);
        if(!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){

            return false;
        } else {

            return true;
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case 1:
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(SendMapLactiontest.this,"PERMISSION_DENIED",Toast.LENGTH_SHORT).show();
                    Intent imgListIntent = new Intent(SendMapLactiontest.this, AddNewItem.class);
                    startActivity(imgListIntent);
                    finish();
                }
                else {
                    Toast.makeText(SendMapLactiontest.this,"PERMISSION_GRANTED",Toast.LENGTH_SHORT).show();
                    mMap.setMyLocationEnabled(true);
                    mMap.getUiSettings().setMyLocationButtonEnabled(true);
                    getDeviceLocation();

                    // permission granted do something
                }
                break;
        }
    }

    private void getDeviceLocation() {
            try {
                Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {

                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            mLastKnownLocation = task.getResult();
                            try {
                                if (mLastKnownLocation==null){
                                    isLocationEnabled();


                                }else {

                            textLatitude.setText("" + mLastKnownLocation.getLatitude());
                            textLongitude.setText("" + mLastKnownLocation.getLongitude());
                                if (mLastKnownLocation != null) {

                                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                            new LatLng(mLastKnownLocation.getLatitude(),
                                                    mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));

                                }
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }


                        } else {

                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                            mMap.moveCamera(CameraUpdateFactory
                                    .newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                            mMap.getUiSettings().setMyLocationButtonEnabled(false);


                        }
                    }
                });

            } catch (SecurityException e) {
                Log.e("Exception: %s", e.getMessage());
            }

    }





}

اتمنى من الي يعرف حل للمشكلة يساعدني 

Recommended Posts

  • 1
نشر

اهلا بك @مروان مروان3

أنت تريد تفقد إذا المستخدم مفعل ال GPS أو لا إذا كذلك ,قمت بعمل فنكشن بسيط سيتفحص إذا ال GPS مفعل أو لا إن غير مفعل نظهر للمستخدم خيار تفعيل ال GPS 

  private void CheckEnableGPS(){
    String provider = Settings.Secure.getString(getContentResolver(),
      Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
       if(!provider.equals("")){
           //GPS مفعل نبدأ الأكتيفتي 
        Toast.makeText(this, "GPS Enabled: " + provider,
          Toast.LENGTH_LONG).show();
       }else{
         //نطلب تفعيله من المستخدم
        Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
           startActivity(intent);
       }

   }

ثم نقوم بإستخدام الفنكشن في ال onCreate ميثود هكذا 

  @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
      
       CheckEnableGPS();
   }

 

  • 0
نشر

السلام عليكم @مروان مروان3

الخطأ لديك هو أنك يجب أن تطلب الأذونات من المستخدم قبل تشغيل الأكتفيتي الذي تريده ,بعد ما يتم إعطاء الأذونات من المستخدم ثم يتم المباشرة في تشغيل الكود وهذا فنكشن بسيط لطلب الأذونات من المستخدم بعد ذلك قم بتشغيل الأكتفيتي إذا المستخدم وافق على إعطاء الأذونات 

 

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;

public boolean checkLocationPermission() {
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            //هنا نظهر للمستخدم لماذا نطلب الأذونات من خلال Dialog 
            // sees the explanation, try again to request the permission.
            new AlertDialog.Builder(this)
                    .setTitle(R.string.title_location_permission)
                    .setMessage(R.string.text_location_permission)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            //Prompt the user once explanation has been shown
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                    MY_PERMISSIONS_REQUEST_LOCATION);
                        }
                    })
                    .create()
                    .show();


        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_LOCATION);
        }
        return false;
    } else {
        return true;
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.ACCESS_FINE_LOCATION)
                        == PackageManager.PERMISSION_GRANTED) {

                    // تم إعطاء الأذونات قم بتشغيل الأكتفيتي هنا 
                }

            } else {

                // permission denied, boo! Disable the
                //في حال لم يعطي المستخدم الأذونات إذاً نلغي التشغيل أو تقوم بإظهر توست بفشل العملية

            }
            return;
        }

    }
}

الأن نقوم بإستخدام الفنكشن في ال onCreate ميثود هكذا 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

   

    checkLocationPermission();
}

 

  • 0
نشر

@مروان مروان3

يمكنك إظهار ال Dialog هكذا ,عدلت الكود لك 

  private void CheckEnableGPS(){
    String provider = Settings.Secure.getString(getContentResolver(),
      Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
       if(!provider.equals("")){
           //GPS مفعل نبدأ الأكتيفتي 
        Toast.makeText(this, "GPS Enabled: " + provider,
          Toast.LENGTH_LONG).show();
       }else{
         //نطلب تفعيله من المستخدم
          new AlertDialog.Builder(this)
                    .setTitle(R.string.title_location_permission)
                    .setMessage("يرجى تفعيل ال GPs")
                    .setPositiveButton("موافق", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
          				 startActivity(intent);
                        }
                    })
                    .create()
                    .show();

        
       }

   }

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...