কীভাবে আমি অ্যান্ড্রয়েডে জিপিএস প্রোগ্রামিয়ালি কার্যকর বা অক্ষম করতে পারি?


158

আমি জানি যে উপর programatically অ্যান্ড্রয়েড GPS বন্ধ / চালু করার প্রশ্ন করেছে জুলুম আলোচনা অনেক বার , এবং উত্তর সবসময় একই হল:

"আপনি সুরক্ষা / গোপনীয়তার কারণে করতে পারবেন না, আপনাকে অবস্থান পছন্দ স্ক্রিনে ফরোয়ার্ড করতে হবে এবং ব্যবহারকারীকে এটি সক্ষম / অক্ষম করতে হবে।"

আমি বুঝি যে, তবে আমি সম্প্রতি কেনা Tasker বাজার থেকে এবং অনেক অন্যান্য বিষয়ের মধ্যে যে আপনি এটি দিয়ে সাধা করতে পারেন পূর্বনির্ধারিত অ্যাপ্লিকেশন এবং নিষ্ক্রিয় প্রস্থানে এটা (দেখুন প্রবেশের উপর জিপিএস স্বয়ংক্রিয় সক্ষম করার জন্য আপনাকে নিয়ম সেট করতে পারেন এখানে জন্য এটি কীভাবে করা যায় তার টিউটোরিয়াল, এবং এটি ঠিক কাজ করে!) এবং এই অ্যাপ্লিকেশনটি ফার্মওয়্যার সাইন ইন কী দিয়ে স্বাক্ষর করা যাবে না কারণ এটি অনেক অ্যান্ড্রয়েড সংস্করণ এবং বিভিন্ন ডিভাইসে কাজ করে এবং আপনাকে এমনকি রুট করার দরকার নেই।

আমি আমার অ্যাপে এটি করতে চাই। অবশ্যই, আমি ব্যবহারকারীর গোপনীয়তাটি ফুটিয়ে তুলতে চাই না, তাই আমি প্রথমে ব্যবহারকারীকে জিজ্ঞাসা করব যে তিনি সাধারণত "আমার সিদ্ধান্ত মনে রাখবেন" চেকবাক্সটি দিয়ে স্বয়ংক্রিয়ভাবে এটি চালু করতে চান এবং যদি তিনি হ্যাঁ উত্তর দেন, এটি সক্ষম করুন।

টাস্কার এটি কীভাবে অর্জন করে সে সম্পর্কে কারও কি কোন ধারণা বা ধারণা আছে?

উত্তর:


161

পাওয়ার ম্যানেজার উইজেটে কোনও বাগ ব্যবহার করে জিপিএস টগল করা যায় । আলোচনার জন্য এই এক্সডিএ থ্রেডটি দেখুন ।

আমি ব্যবহার করি কিছু উদাহরণ কোড এখানে

private void turnGPSOn(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(!provider.contains("gps")){ //if gps is disabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

private void turnGPSOff(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps")){ //if gps is enabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

পাওয়ার কন্ট্রোল উইজেটের বিদ্যমান সংস্করণ এমন একটি কিনা যা আপনাকে জিপিএস টগল করার অনুমতি দেবে তা পরীক্ষা করতে নিম্নলিখিতটি ব্যবহার করুন।

private boolean canToggleGPS() {
    PackageManager pacman = getPackageManager();
    PackageInfo pacInfo = null;

    try {
        pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS);
    } catch (NameNotFoundException e) {
        return false; //package not found
    }

    if(pacInfo != null){
        for(ActivityInfo actInfo : pacInfo.receivers){
            //test if recevier is exported. if so, we can toggle GPS.
            if(actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported){
                return true;
            }
        }
    }

    return false; //default
}

4
এই (আমার) মন্তব্যের সময়, এই উত্তরের লিঙ্কগুলি ইঙ্গিত করে যে এটি যে বাগটি ব্যবহার করেছে তা সম্প্রতি স্থির করা হয়েছে। আমি কেবল এটিই উল্লেখ করতে চেয়েছিলাম যে শোষণটি এখনও আমার নিজের পরীক্ষার পরিবেশে ঠিকঠাক কাজ করে বলে মনে হচ্ছে, সুতরাং আপনার এই চেষ্টা করা ছেড়ে দেওয়া উচিত নয় ... ঠিক নিশ্চিত হন যে আপনার কোডটি যদি কাজ না করে তবে কোনও ত্রুটি পরিচালনা করবে sure !
সিলিথক্রো

1
এই মন্তব্যের লেখার হিসাবে, এই শোষণটি এখনও একটি 2.2.1 অ্যান্ড্রয়েড ফোনে কাজ করে। খুব ভাল
লাগছে

38
এটি সত্যিই খারাপ ধারণা। বাগ ঠিক হয়ে গেলে আপনার শোষণ আর কাজ করবে না। ব্যবহারকারীকে সেটিংস অ্যাপটিতে প্রেরণ করা আরও ভাল।
এডওয়ার্ড ফ্যাল্ক

1
অ্যান্ড্রয়েড ২.৩..6 এ দুর্দান্ত কাজ করছে তবে অ্যান্ড্রয়েড 4.0.০.৩ কাজ করছে না। অ্যান্ড্রয়েড .3.০.৩ সক্ষম বা অক্ষম করার জন্য কোনও ধারণা
কৃষ্ণ

5
হাহাহাহা ... এই শোষণটি 4.2.2 এ পুনরায় ডুবে গেছে, এটি দেখে অবাক হয়েছেন .. ODশ্বর!
amithgc

70

এই সমস্ত উত্তর এখন অনুমোদিত হয় না। এখানে সঠিক একটি:

এখনও উত্তর খুঁজছেন তাদের সকলের জন্য:

ওএলএ ক্যাবস এবং এ জাতীয় অন্যান্য অ্যাপস এটি কীভাবে করছে তা এখানে রয়েছে।

এটি আপনার অনক্রিটে যুক্ত করুন

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API).addConnectionCallbacks(this)
            .addOnConnectionFailedListener(Login.this).build();
    googleApiClient.connect();
            LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    // **************************
    builder.setAlwaysShow(true); // this is the key ingredient
    // **************************

    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi
            .checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result
                    .getLocationSettingsStates();
            switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
                // All location settings are satisfied. The client can
                // initialize location
                // requests here.
                break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                // Location settings are not satisfied. But could be
                // fixed by showing the user
                // a dialog.
                try {
                    // Show the dialog by calling
                    // startResolutionForResult(),
                    // and check the result in onActivityResult().
                    status.startResolutionForResult(Login.this, 1000);
                } catch (IntentSender.SendIntentException e) {
                    // Ignore the error.
                }
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are not satisfied. However, we have
                // no way to fix the
                // settings so we won't show the dialog.
                break;
            }
        }
    });
}

এগুলি হ'ল ফলিত পদ্ধতি:

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

এটির জন্য এখানে অ্যান্ড্রয়েড ডকুমেন্টেশন

এটি অন্য ছেলেদের এখনও লড়াই করে যদি তাদের সহায়তা করা হয়:

সম্পাদনা : আরও সহায়তার জন্য ইরফান রাজার মন্তব্য যুক্ত করা হচ্ছে।

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 1000) {
         if(resultCode == Activity.RESULT_OK){
             String result=data.getStringExtra("result"); 
         } if (resultCode == Activity.RESULT_CANCELED) {
             //Write your code if there's no result 
         } 
    } 
} 

এখন এই উত্তরটি গ্রহণযোগ্য হওয়া উচিত। অনেক ধন্যবাদ অক্ষত !!
গুরপ্রীত

2
গুগল এপিআই ক্লায়েন্ট ইন্টিগ্রেশন প্রয়োজন তাই নির্দিষ্ট ব্যবহারের ক্ষেত্রে কেবল একটি সমাধানই জেনেরিক সমাধানের জন্য উপযুক্ত নয়।
সিক

@ দিলরুপসিংহ আপনি কি সমস্যার মুখোমুখি হচ্ছেন? আমি একই কোড ব্যবহার করছি এবং এটি পুরোপুরি কার্যকর হয়।
অক্ষত

1
আমরা কী সেই বিল্ডারকে না দেখিয়ে এটি অর্জন করতে পারি B কারণ কোনও সতর্কতা না দেখিয়ে আমাকে জিপি চালু করতে হবে।
পুনিথাপ্রিয়া

3
@ পুনিথপ্রিয়া থ্যাটস সম্ভব নয়। ব্যবহারকারীর সম্মতি অবশ্যই এবং তাই এইভাবে বিল্ডারকে দেখাতে হবে।
অক্ষত

50

সক্ষম জিপিএস:

Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

অক্ষম জিপিএস:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

1
স্বয়ংক্রিয়ভাবে জিপিএস চালু / বন্ধ হবে।
ডিবাগার

1
এটি সক্ষম করতে সহায়তা করে। বেসরকারী অকার্যকর টার্নে জিপিএসঅন () {স্ট্রিং সরবরাহকারী = সেটিংস.সিকিউর.সেটস্ট্রিং (getContentResolver (), সেটিংস.সিকিউর। if (! Provider.contains ("gps")) {// জিপিএস অক্ষম থাকলে চূড়ান্ত ইনটেন্ট পোকে = নতুন উদ্দীপনা (); poke.setClassName ("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory (Intent.CATEGORY_ALTERNATIVE); poke.setData (Uri.parse ( "3")); sendBroadcast (অকর্মা); }}
ডিবাগার

অ্যান্ড্রয়েড ২.৩.৪ এ অসমসং এসআইআই চলমান এটি কার্যকরভাবে জিপিএস সেন্সরটি সক্রিয় না করে জিপিএস আইকনটি চালু করে। তবে, আপনি যদি জিপিএস সেন্সরটিকে প্রোগ্রামগতভাবে চালু করতে চান, তবে তা স্বীকৃত।
টনি গিল

24
অ্যান্ড্রয়েড 4.0.4 - শুধুমাত্র জিপিএস বিজ্ঞপ্তি সক্ষম করা হয়েছে। জিপিএস নিজেই না। এটি দেখে মনে হচ্ছে এটি চালু আছে তবে বাস্তবে তা নেই
এলেক্স

14
java.lang.SecurityException: অনুমতি অস্বীকার: সম্প্রচার android.location.GPS_ENABLED_CHANGE
অভি

28

এই কোড কাজ করে মূলী ফোনের যদি অ্যাপ্লিকেশানে সরানোর সময় /system/aps , এবং তারা ম্যানিফেস্টে নিম্নলিখিত অনুমতি :

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

কোড

private void turnGpsOn (Context context) {
    beforeEnable = Settings.Secure.getString (context.getContentResolver(),
                                              Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    String newSet = String.format ("%s,%s",
                                   beforeEnable,
                                   LocationManager.GPS_PROVIDER);
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   newSet); 
    } catch(Exception e) {}
}


private void turnGpsOff (Context context) {
    if (null == beforeEnable) {
        String str = Settings.Secure.getString (context.getContentResolver(),
                                                Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        if (null == str) {
            str = "";
        } else {                
            String[] list = str.split (",");
            str = "";
            int j = 0;
            for (int i = 0; i < list.length; i++) {
                if (!list[i].equals (LocationManager.GPS_PROVIDER)) {
                    if (j > 0) {
                        str += ",";
                    }
                    str += list[i];
                    j++;
                }
            }
            beforeEnable = str;
        }
    }
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   beforeEnable);
    } catch(Exception e) {}
}

5
এই পদ্ধতির উল্লেখ করার জন্য +1। ননরোটেড ডিভাইসে এটি সিস্টেম-অ্যাপের সাথেও কাজ করা উচিত।
অ্যালেক্স

এই সঠিক উপায়। অ্যান্ড্রয়েডের প্রতিটি সংস্করণে কাজ করে, কোনও কৌশল দরকার নেই!
বিউক্যাড্রা

জিপিএস বন্ধ করে কাজ করছে না !! আপনি দয়া করে আমাকে এবং কেন সম্ভাব্য সমাধান বলতে পারেন?
শিবংশ

এখন জিপিএস বন্ধ হয়ে যাচ্ছে এবং নিখুঁতভাবে চালু হচ্ছে তবে জিপিএস কাজ করছে না, অর্থাৎ
লোকেশনটি

<ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.WRITE_SECURE_SETTINGS" /> কেবলমাত্র সিস্টেম
এপিএসের

23

অভিযোজনীয় সেটিংস ব্যবহার না করে। অ্যাকশন_বোকেশন_সেসিআর.সি.টি.টি.এস. আপনি গুগল ম্যাপের মতো আপনার অ্যাপে সরাসরি পপ আপ করতে পারবেন এবং জিপিএস-এ ওকে বাটনে ক্লিক করতে পারেন সেগুলিতে পুনঃনির্দেশ করার দরকার নেই কেবল আমার কোড হিসাবে আপনার ব্যবহার করা দরকার

দ্রষ্টব্য: কোডটি এই লাইনটি অবস্থানটি চালু না থাকলে ডায়ালগ বক্সটি স্বয়ংক্রিয়ভাবে খুলুন। এই টুকরো রেখাটি গুগল ম্যাপেও ব্যবহৃত হয়

 public class MainActivity extends AppCompatActivity
    implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {


LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
PendingResult<LocationSettingsResult> result;
final static int REQUEST_LOCATION = 199;

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

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    mGoogleApiClient.connect();

}

@Override
public void onConnected(Bundle bundle) {

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            //final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    //...
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                MainActivity.this,
                                REQUEST_LOCATION);
                    } catch (SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    //...
                    break;
            }
        }
    });

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    Log.d("onActivityResult()", Integer.toString(resultCode));

    //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode)
    {
        case REQUEST_LOCATION:
            switch (resultCode)
            {
                case Activity.RESULT_OK:
                {
                    // All required changes were successfully made
                    Toast.makeText(MainActivity.this, "Location enabled by user!", Toast.LENGTH_LONG).show();
                    break;
                }
                case Activity.RESULT_CANCELED:
                {
                    // The user was asked to change settings, but chose not to
                    Toast.makeText(MainActivity.this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
                    break;
                }
                default:
                {
                    break;
                }
            }
            break;
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}
} 

দ্রষ্টব্য: কোডটি এই লাইনটি অবস্থানটি চালু না থাকলে ডায়ালগ বক্সটি স্বয়ংক্রিয়ভাবে খুলুন। এই টুকরো রেখাটি গুগল ম্যাপেও ব্যবহৃত হয়


1
এই কোডটি ঠিকঠাক কাজ করছে তবে গ্রেড ফাইলটিতে অবস্থানের অনুমতি এবং প্লেসার্ভিস জারের কথাটি ভুলে যাবেন না ...
আকাশ পাসুপতি

22

অ্যান্ড্রয়েড সংস্করণ ৪.৪ থেকে আপনি জিপিএসগুলিকে প্রোগ্রামাগ্রামে সক্ষম / অক্ষম করতে পারবেন না। আপনি যদি এই উত্তরের প্রস্তাবিত কোডটি চেষ্টা করেন তবে একটি ব্যতিক্রম বরখাস্ত করা হবে।

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE

2
সুতরাং এটি একটি মন্তব্য না হয় সমাধান কি?
শৈলেন্দ্র মাদদা

@ শৈলেন্দ্র মাদদা জিপিএস সক্ষম করার কোনও সমাধান নেই is আপনি কেবলমাত্র সম্পর্কিত ডায়ালগটিই প্রার্থনা করতে পারেন।
অবিশ্বাস্য জানুয়ারী

6

প্রোগ্রামটিমেটিকভাবে জিপিএস চালু বা বন্ধ করতে আপনার প্রয়োজন হবে 'রুট' অ্যাক্সেস এবং ব্যাসিবক্স ইনস্টল। এমনকি তাদের সাথে, কাজটিও তুচ্ছ নয়।

নমুনা এখানে: গুগল ড্রাইভ , গিথুব , সোর্সফোর্জ

2.3.5 এবং 4.1.2 অ্যান্ড্রয়েড দিয়ে পরীক্ষা করা হয়েছে।


নমুনা আর পাওয়া যায় না।
অ্যান্ড্রয়েড বিকাশকারী

এটি সর্বশেষ: র‍্যাপিডেয়ার.com / files / 1458124346 / GPSToggler-20130222.7z আমি দুর্ঘটনাক্রমে পুরানো সংস্করণটি মুছলাম। ব্যস্তবক্সের আর দরকার নেই।
ওজিপি

এখনও পাওয়া যায় না। হয়ত কোনও আলাদা ফাইল আপলোড পরিষেবা ব্যবহার করবেন?
অ্যান্ড্রয়েড বিকাশকারী

আমি ফোল্ডারটি সর্বজনীন এবং যাচাই করেছি। এখন এটি ডাউনলোড করা যাবে। এছাড়াও আমার ব্যক্তিগত এখানে এফটিপি: StackExchange: se@oldgopher.gotdns.com
OGP


5

উপরে সঠিক উত্তর খুব পুরানো এটি কিছু নতুন প্রয়োজন তাই উত্তর এখানে

সর্বশেষ আপডেটের মতো আমাদের অ্যান্ড্রয়েডেক্স সমর্থন রয়েছে তাই আপনার অ্যাপ্লিকেশন স্তরের build.gradle ফাইলের মধ্যে প্রথমে নির্ভরতা অন্তর্ভুক্ত করুন

implementation 'com.google.android.gms:play-services-location:17.0.0'

তারপরে আপনার মেনিফেস্ট ফাইলটিতে যুক্ত করুন:

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

আপনি যদি ছাড় দিচ্ছেন তবে এই অনুমতিগুলির জন্য ব্যবহারকারীর সম্মতি নিতে ভুলবেন না

এখন এখানে কোড কেবল এটি ব্যবহার করুন

 protected void createLocationRequest() {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(5000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    SettingsClient client = LocationServices.getSettingsClient(this);
    Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());



    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...

            Toast.makeText(MainActivity.this, "Gps already open", 
                                          Toast.LENGTH_LONG).show();
            Log.d("location settings",locationSettingsResponse.toString());
        }
    });

    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (e instanceof ResolvableApiException) {
                // Location settings are not satisfied, but this can be fixed
                // by showing the user a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        }
    });
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode==REQUEST_CHECK_SETTINGS){

        if(resultCode==RESULT_OK){

            Toast.makeText(this, "Gps opened", Toast.LENGTH_SHORT).show();
            //if user allows to open gps
            Log.d("result ok",data.toString());

        }else if(resultCode==RESULT_CANCELED){

            Toast.makeText(this, "refused to open gps", 
                                         Toast.LENGTH_SHORT).show();
            // in case user back press or refuses to open gps
            Log.d("result cancelled",data.toString());
        }
    }
}

যদি কিছু ভুল হয়ে থাকে তবে আমাকে পিং করুন


2

অন্য প্রশ্নের একটি উত্তর তৈরি করা হয়েছিল, তবে এটি বন্ধ ছিল এবং আমি সম্প্রদায়টিও এটি চেষ্টা করে দেখতে চাই।

boolean gpsStatus = locmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsStatus) {
    Settings.Secure.putString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "network,gps");
}

এই মন্তব্য দেখুন

এই সমাধানটির অনুমতি WRITE_SETTINGSএবং WRITE_SECURE_SETTINGSঅনুমতি প্রয়োজন।


@ মিলিন্ড, ধরুন আমার একটি শিকড় ডিভাইস আছে, এই কোডটি ব্যবহার করার জন্য আমার কী করা উচিত? আমি অ্যাপ্লিকেশনটির জন্য একটি রুট অনুমতি পেতে চেষ্টা করেছি, কিন্তু এটি কার্যকর হয়নি। : "নিরাপত্তার সেটিংস লিখিতভাবে android.permission.WRITE_SECURE_SETTINGS প্রয়োজন অনুমতি অস্বীকার" এটা বলার অপেক্ষা রাখে না রাখে
Android বিকাশকারী

@ অ্যান্ড্রয়েড এই পোস্টের শেষ বাক্যটি পড়ুন। এই পদ্ধতিটি ব্যবহারের android.permission.WRITE_SECURE_SETTINGSজন্য ম্যানিফেস্টে অনুমতি প্রয়োজন হবে ।
গোবরনাদর

1
আমি জানি . আমি ইতিমধ্যে এটি যোগ করেছি। এটি আমাকে জানিয়েছে যে এটি ইতিমধ্যে ম্যানিফেস্টে রয়েছে।
অ্যান্ড্রয়েড বিকাশকারী


সুতরাং এটি এমনকি মূলযুক্ত ডিভাইসগুলির জন্যও অসম্ভব ?!
অ্যান্ড্রয়েড বিকাশকারী

2

ক্লাসের চারপাশে প্রতিফলন কৌশল সহ android.server.LocationManagerService

এছাড়াও, একটি পদ্ধতি রয়েছে (API 8 থেকে) android.provider.Settings.Secure.setLocationProviderEnabled


3
এই Settings.Secureশ্রেণিটি প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে, তবে আমি সুরক্ষা ব্যতিক্রম পেয়ে বলছি যে আমার android.permission দরকার। তবে এটি অনুসন্ধান চালিয়ে যাওয়ার একটি ভাল উপায় বলে মনে হচ্ছে। ধন্যবাদ :)
maid450

WRITE_SECURE_SETTINGSআপনার অ্যাপ্লিকেশনটির কাজ করার জন্য একটি সিস্টেম অ্যাপ তৈরি করা দরকার আপনার একটি সুরক্ষা স্তর রয়েছেsystemOrSignature যা এই উত্তরেও উল্লেখ করা হয়েছে
ফ্লো

2

এটি প্রদত্ত সেরা সমাধান Google Developers। শুরু করার পরে অনক্রিটের পুনরায় সূচনাতে এই পদ্ধতিটি কল করুন GoogleApiClient

private void updateMarkers() {
    if (mMap == null) {
        return;
    }

    if (mLocationPermissionGranted) {
        // Get the businesses and other points of interest located
        // nearest to the device's current location.
         mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API).build();
        mGoogleApiClient.connect();
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(10000 / 2);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);


        LocationSettingsRequest.Builder builder = new LocationSettingsRequest
                .Builder()
                .addLocationRequest(mLocationRequest);
        PendingResult<LocationSettingsResult> resultPendingResult = LocationServices
                .SettingsApi
                .checkLocationSettings(mGoogleApiClient, builder.build());

        resultPendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();
                final LocationSettingsStates locationSettingsStates = locationSettingsResult.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can
                        // initialize location requests here.

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied, but this can be fixed
                        // by showing the user a dialog.


                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(
                                    MainActivity.this,
                                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.


                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way
                        // to fix the settings so we won't show the dialog.


                        break;
                }

            }
        });


        @SuppressWarnings("MissingPermission")
        PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                .getCurrentPlace(mGoogleApiClient, null);
        result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
            @Override
            public void onResult(@NonNull PlaceLikelihoodBuffer likelyPlaces) {
                for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                    // Add a marker for each place near the device's current location, with an
                    // info window showing place information.
                    String attributions = (String) placeLikelihood.getPlace().getAttributions();
                    String snippet = (String) placeLikelihood.getPlace().getAddress();
                    if (attributions != null) {
                        snippet = snippet + "\n" + attributions;
                    }

                    mMap.addMarker(new MarkerOptions()
                            .position(placeLikelihood.getPlace().getLatLng())
                            .title((String) placeLikelihood.getPlace().getName())
                            .snippet(snippet));
                }
                // Release the place likelihood buffer.
                likelyPlaces.release();
            }
        });
    } else {
        mMap.addMarker(new MarkerOptions()
                .position(mDefaultLocation)
                .title(getString(R.string.default_info_title))
                .snippet(getString(R.string.default_info_snippet)));
    }
}

দ্রষ্টব্য: কোডের এই লাইনটি ডায়ালগ বাক্সটি চালু না থাকলে স্বয়ংক্রিয়ভাবে খুলুন Locationএই টুকরো রেখাটি গুগল ম্যাপেও ব্যবহৃত হয়

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

MLocationPermissionGranted কি ?
বি ডেভলপার

এটি সেই স্থানের জন্য অনুমতি দেওয়া হয়েছে কিনা তা যাচাই করার জন্য। এই run timeঅনুমতি দেওয়া হয়।
আমান সিং

আপনি যদি ইতিমধ্যে প্রাক-ললিপপ ডিভাইসে অনুমতি প্রদান করে থাকেন তবে মানটিকে সত্য করে দিয়ে কেবল অজানা যেতে পারেন
আমান সিংহ

2

এই কোডটি মূলযুক্ত ফোনে কাজ করে:

public class MainActivity extends AppCompatActivity {

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

        String[] cmds = {"cd /system/bin" ,"settings put secure location_providers_allowed +gps"};
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

জিপিএস বন্ধ করার জন্য আপনি পরিবর্তে এই আদেশটি ব্যবহার করতে পারেন

settings put secure location_providers_allowed -gps

আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে নেটওয়ার্কের নির্ভুলতাও টগল করতে পারেন: ব্যবহার চালু করার জন্য:

settings put secure location_providers_allowed +network

এবং বন্ধ করার জন্য আপনি ব্যবহার করতে পারেন:

settings put secure location_providers_allowed -network

1

এই প্রশ্নটি পোস্ট হওয়ার পরে বিষয়গুলি পরিবর্তিত হয়েছে, এখন নতুন গুগল পরিষেবাদি এপিআই সহ, আপনি ব্যবহারকারীদের জিপিএস সক্ষম করতে অনুরোধ করতে পারেন:

https://developers.google.com/places/android-api/current-place

আপনাকে আপনার ম্যানিফেস্টে ACCESS_FINE_LOCATION অনুমতির জন্য অনুরোধ করতে হবে:

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

এই ভিডিওটি দেখুন:

https://www.youtube.com/watch?v=F0Kh_RnSM0w


ধন্যবাদ। তবে গুগল প্লে সার্ভিসেস 7 টি কি পুরানো অ্যান্ড্রয়েড সংস্করণ ব্যবহার করা যাবে? (এপিআই 14 - 23)
জে কার্লোসআর

1

এই আমার জন্য কাজ করে।

এই প্রশ্নটিতে আরজে 0078 এর উত্তরটি এখন সহজ ( https://stackoverflow.com/a/42556648/11211963 ) পাশাপাশি কাজ করা হয়েছে।

এটি এর মতো একটি সংলাপ দেখায়:

এখানে চিত্র বর্ণনা লিখুন

(কোটলিনে লিখিত)

    googleApiClient = GoogleApiClient.Builder(context!!)
        .addApi(LocationServices.API).build()
    googleApiClient!!.connect()
    locationRequest = LocationRequest.create()
    locationRequest!!.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    locationRequest!!.interval = 30 * 1000.toLong()
    locationRequest!!.fastestInterval = 5 * 1000.toLong()

    val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest!!)
    builder.setAlwaysShow(true)

    result =
       LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
    result!!.setResultCallback { result ->
        val status: Status = result.status
        when (status.statusCode) {
            LocationSettingsStatusCodes.SUCCESS -> {
               // Do something
            }
            LocationSettingsStatusCodes.RESOLUTION_REQUIRED ->
                try {
                    startResolutionForResult(),
                    status.startResolutionForResult(
                        activity,
                        REQUEST_LOCATION
                    )
                } catch (e: SendIntentException) {
                }
            LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                // Do something
            }
        }
    }

0

আপনার কেবল এ LocationListenerথেকে অপসারণ করা দরকারLocationManager

manager.removeUpdates(listener);

-1

এই কোডটি সহজ এবং অ্যাক্সেসে সহজ ব্যবহার করুন:

অনুমতিসমূহ:

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

প্রোগ্রামটিমে জিপিএস অ্যাক্সেস করতে এই কোডটি অনুসরণ করুন:

LocationManager locationManager ;
 boolean GpsStatus ;


            GPSStatus();

            if(GpsStatus == true)
            {
                textview.setText("Your Location Services Is Enabled");
            }else
                {textview.setText("Your Location Services Is Disabled");}

            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);


    public void GPSStatus(){
    locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    GpsStatus = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.