কোথায় আমি? - দেশ পাও


126

একটি অ্যান্ড্রয়েড মোবাইল আসলে এটি কোথায় তা বেশ ভালভাবেই জানে - তবে কি কোনও দেশের কোডের মতো কিছু দিয়ে দেশ পুনরুদ্ধারের উপায় আছে?

সঠিক জিপিএস অবস্থান জানার দরকার নেই - দেশটি যথেষ্ট

আমি প্রথম টাইম জোনটি ব্যবহার করার কথা ভেবেছিলাম, তবে বাস্তবে আমার তুলনায় আমার আরও বেশি তথ্য প্রয়োজন কারণ অবস্থানটি নিউইয়র্ক বা লিমা হলে এটি কোনও পার্থক্য করে।

প্রশ্নের পটভূমি: আমার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যা তাপমাত্রার মানগুলি ব্যবহার করে এবং আমি অবস্থানটি মার্কিন বা বাইরের কিনা তার উপর নির্ভর করে আমি সেলসিয়াস বা ফারেনহাইটে ডিফল্ট ইউনিট সেট করতে চাই depending


14
-1: আপনি স্পষ্টভাবে না যেখানে জানতে ব্যবহারকারী চান হয় । আপনি ব্যবহারকারীর লোকেল সেটিংটি জানতে চান। গৃহীত উত্তরগুলি ঠিক সেটির উত্তর দেয়, তবে অন্যথায় এখানে সম্পূর্ণ অনুপযুক্ত, কারণ অনুসন্ধান এখানে এমন লোকদের নির্দেশ করবে যারা প্রকৃতপক্ষে ব্যবহারকারী কোথায় তা জানতে চায়।
জান হুডেক

উত্তর:


96

এটি ফোনের জন্য দেশের কোড সেট পাবেন (ফোনের ভাষা, ব্যবহারকারীর অবস্থান নয়):

 String locale = context.getResources().getConfiguration().locale.getCountry(); 

দেশের জন্য একটি 3 অক্ষরের আইএসও কোড পেতে getISO3Country () এর সাথে getCountry () কে প্রতিস্থাপন করতে পারে । এটি দেশের নাম পাবে :

 String locale = context.getResources().getConfiguration().locale.getDisplayCountry();

এটি অন্যান্য পদ্ধতির তুলনায় সহজ বলে মনে হয় এবং ফোনে লোকালাইজেশন সেটিংসের উপর নির্ভর করে, সুতরাং কোনও মার্কিন ব্যবহারকারী বিদেশে থাকলে তারা সম্ভবত ফারেনহাইট চান এবং এটি কাজ করবে :)

সম্পাদকগণ দ্রষ্টব্য : এই সমাধানটির ফোনের অবস্থানের সাথে কোনও সম্পর্ক নেই। এটা ধ্রুবক। আপনি জার্মানি ভ্রমণ করার সময় লোকালে পরিবর্তন হবে না। সংক্ষেপে: লোকেল! = অবস্থান।


83
এটি এমন দেশগুলিতে কাজ করবে না যেগুলির জন্য অ্যান্ড্রয়েডের লোকেল নেই। উদাহরণস্বরূপ, সুইজারল্যান্ডে, ভাষা সম্ভবত জার্মান বা ফরাসীতে সেট করা যেতে পারে। এই পদ্ধতি আপনাকে জার্মানি বা ফ্রান্স দেবে, সুইজারল্যান্ডকে নয়। লোকেশনম্যানেজার বা টেলিফোনি ম্যানেজার পদ্ধতির ব্যবহার করা আরও ভাল।
ম্যাথিউআই

5
ভাল কাজ করে না। লাতিন আমেরিকার সমস্ত দেশগুলির জন্য আমাকে ব্যবহারকারীর দেশকে আলাদা করতে হবে, ফোনটি ইংলিশ বা স্প্যানিশ ল্যাং-তে থাকা অবস্থায়ও সমস্ত পরীক্ষার ফোনগুলি মার্কিন যুক্তরাষ্ট্রে ফিরে এসেছে।
htafoya

21
এই উত্তর না শিরোনাম প্রশ্নই। আমি ইংরেজি ফোন সেট থাকতে পারে এবং বিশ্বের যে কোন জায়গায় সম্পর্কে করা (আমার স্থানীয় ভাষা না ইংরেজি, কিন্তু আমি কি করতে (ব্রিটিশ) ইংরেজি আমার ফোন সেট আছে। তবে এটি প্রকৃত প্রশ্নের উত্তর নেই , কারণ ব্যবহারকারী মার্কিন ইউনিট যদি চায় তিনি ইউএসএইয়ান, তিনি যেখানেই আসবেন বাস্তবে এই মুহুর্তে রয়েছে
জানু হুডেক

2
দেশের নাম পাওয়ার সম্ভাব্য সমাধান নয়
আমিরখান

2
এটি সাধারণভাবে একটি ভাল উত্তর তবে এটি কেবল স্থানীয় দেশকেই ফিরিয়ে দেয়, আসল দেশকে নয়।
dst

138
/**
 * Get ISO 3166-1 alpha-2 country code for this device (or null if not available)
 * @param context Context reference to get the TelephonyManager instance from
 * @return country code or null
 */
public static String getUserCountry(Context context) {
    try {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        final String simCountry = tm.getSimCountryIso();
        if (simCountry != null && simCountry.length() == 2) { // SIM country code is available
            return simCountry.toLowerCase(Locale.US);
        }
        else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable)
            String networkCountry = tm.getNetworkCountryIso();
            if (networkCountry != null && networkCountry.length() == 2) { // network country code is available
                return networkCountry.toLowerCase(Locale.US);
            }
        }
    }
    catch (Exception e) { }
    return null;
}

14
সিম কার্ড সহ কেবল ফোন বা অন্যান্য ডিভাইসে কাজ করে। ওয়াইফাই ট্যাবলেট ব্যবহার করার সময়, আপনি শূন্য পাবেন। সুতরাং এর উপযোগিতা সীমিত।
ব্রাম

1
@ ব্র্যাম এটিই আপনি পেতে পারেন। সুতরাং এটি আসলে বেশ কার্যকর, সমস্যাটি কেবলমাত্র আপনার যদি কোনও WiFi- কেবল ট্যাবলেট থাকে তবে আপনার কাছে অন্য কোনও নির্ভরযোগ্য ডেটা উত্স নেই।
কাও

11
নোট করুন যে মার্কিন যুক্তরাষ্ট্রের কোনও ব্যবহারকারী ফ্রান্সে ছুটিতে থাকলে, getSimCountryIsoবলবে usএবং getNetworkCountryIsoবলবেfr
টিম

1
আপনি toLowerCase()কলটি পরিবর্তন করতে চাইতে পারেন toUpperCase()
toobsco42

আমার কোডের নাম নয় কোড দরকার; মার্কিন যুক্তরাষ্ট্রের জন্য নয় মার্কিন যুক্তরাষ্ট্রের জন্য
শিহাব উদ্দিন

67

এই লিঙ্কটি http://ip-api.com/json ব্যবহার করুন , এটি json হিসাবে সমস্ত তথ্য সরবরাহ করবে। এই জসন থেকে আপনি সহজেই দেশটি পেতে পারেন। এই সাইটটি আপনার বর্তমান আইপি ব্যবহার করে কাজ করে, এটি স্বয়ংক্রিয়ভাবে আইপি এবং প্রেরকব্যাক বিশদ সনাক্ত করে।

দস্তাবেজগুলি http://ip-api.com/docs/api:json আশা করি এটি সহায়তা করবে।

উদাহরণস্বরূপ json

{
  "status": "success",
  "country": "United States",
  "countryCode": "US",
  "region": "CA",
  "regionName": "California",
  "city": "San Francisco",
  "zip": "94105",
  "lat": "37.7898",
  "lon": "-122.3942",
  "timezone": "America/Los_Angeles",
  "isp": "Wikimedia Foundation",
  "org": "Wikimedia Foundation",
  "as": "AS14907 Wikimedia US network",
  "query": "208.80.152.201"
}

দ্রষ্টব্য : এটি তৃতীয় পক্ষের সমাধান হিসাবে, অন্যরা যদি কাজ না করে তবেই ব্যবহার করুন।


1
আমি নিশ্চিত নই যে ওপি ঠিক এটাই চেয়েছিল তবে আমি উত্তরটি যাইহোক পছন্দ করি।
জনিলম্বদা

1
উত্তরটি পছন্দ করুন যেহেতু এটি ট্যাবলেটগুলিতে (সিম ছাড়াই) কাজ করবে। টেলিফোনির সমাধান সক্রিয় সিমস সহ কেবল ফোনে কাজ করে। ডুয়াল সিম ফোনগুলি হ'ল অন্য সমস্যার কারণ তারা বিভিন্ন দেশ হতে পারে। সুতরাং সম্ভবত এটি উপরে বর্ণিত আইপি সমাধানের উপর নির্ভর করা আরও বোধগম্য।
মনীষ কাটারিয়া

1
যদিও আপনি উল্লেখ করেছেন, এটি সমস্যার সর্বোত্তম পদ্ধতির নাও হতে পারে, এটি আসলে একটি বৈধ সমাধান সরবরাহ করে। আমার কাছ থেকে +1 এবং আপনাকে ধন্যবাদ!
মাত্তেও

1
তৃতীয় পক্ষগুলি ব্যবহার করা সবসময় খারাপ, আপনি কখনই জানতে পারবেন না যে সেখানে কতটা স্থিতিশীল রয়েছে। যেমন - পার্স
নাতিভ

1
তবে এর সীমাবদ্ধতা রয়েছে। তাদের সিস্টেম প্রতি মিনিটে 150 টিরও বেশি অনুরোধ করে কোনও আইপি ঠিকানাগুলি স্বয়ংক্রিয়ভাবে নিষিদ্ধ করবে।
রাম মণ্ডল

62

আসলে আমি সবেমাত্র জানতে পেরেছি যে একটি দেশের কোড পাওয়ার আরও একটি উপায় আছে, getSimCountryIso () এর পদ্ধতিটি ব্যবহার করে TelephoneManager:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();

যেহেতু এটি সিম কোড তাই অন্য দেশে ভ্রমণের সময়ও এটি পরিবর্তন করা উচিত নয়।


43
ডিভাইসে সিম কার্ড না থাকলে এটি কাজ করতে পারে না, উদাহরণস্বরূপ ট্যাবলেট
থোমাসডাও

38

প্রথমে লোকেশনম্যানেজারটি পান। তারপরে, কল করুন LocationManager.getLastKnownPosition। তারপরে একটি জিওকোডার তৈরি করুন এবং কল করুন GeoCoder.getFromLocation। এটি কি আলাদা থ্রেডে আছে !! এটি আপনাকে Addressঅবজেক্টের একটি তালিকা দেবে । কল করুন Address.getCountryNameএবং আপনি এটি পেয়েছেন।

মনে রাখবেন যে সর্বশেষ জ্ঞাত অবস্থানটি কিছুটা বাসি হতে পারে, তাই যদি ব্যবহারকারী সবেমাত্র সীমানাটি অতিক্রম করে থাকেন তবে আপনি এটি সম্পর্কে কিছুক্ষণ জানেন না।


এই অ্যাপ্লিকেশনটির জন্য ডিফল্ট ইউনিট পরিবর্তন করা যখন দেশগুলিতে সিলসিয়াস বা ফারেনহাইটের পছন্দ পছন্দ না করে সে নতুন জমিগুলিতে যাত্রা শুরু করে না কেন সেগুলি পরিবর্তন করা পছন্দ হবে না।
স্টিলথকপ্টার

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

এটি অত্যন্ত রেটযুক্ত উত্তরগুলির অধীনে তবে সত্যটি হ'ল এটিই সবচেয়ে নির্ভরযোগ্য সমাধান। উপরের বেশিরভাগ উত্তরগুলি ওয়াইফাই নেটওয়ার্কের জন্য কাজ করে না। @ শাইন_জোসেফ দ্বারা সরবরাহিত একটি দেখতে দুর্দান্ত দেখাচ্ছে তবে প্রদত্ত এপিআই বাণিজ্যিক ব্যবহারের জন্য নয়।
মণি

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

17

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

দ্রষ্টব্য: কোডটিতে PreferencesManager রয়েছে, এটি একটি সহায়ক শ্রেণি যা SharedPrefrences থেকে ডেটা সংরক্ষণ এবং লোড করে। আমি এটি এস পি তে দেশ বাঁচাতে ব্যবহার করছি, আমি কেবল দেশটি খালি থাকলেই পাচ্ছি my আমার পণ্যটির জন্য আমি সত্যই সমস্ত প্রান্তের ক্ষেত্রে যত্নশীল না (ব্যবহারকারী বিদেশে ভ্রমণ করেন) ইত্যাদি।

public static String getCountry(Context context) {
    String country = PreferencesManager.getInstance(context).getString(COUNTRY);
    if (country != null) {
        return country;
    }

    LocationManager locationManager = (LocationManager) PiplApp.getInstance().getSystemService(Context.LOCATION_SERVICE);
    if (locationManager != null) {
        Location location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location == null) {
            location = locationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }
        if (location == null) {
            log.w("Couldn't get location from network and gps providers")
            return
        }
        Geocoder gcd = new Geocoder(context, Locale.getDefault());
        List<Address> addresses;
        try {
            addresses = gcd.getFromLocation(location.getLatitude(),
                    location.getLongitude(), 1);

            if (addresses != null && !addresses.isEmpty()) {
                country = addresses.get(0).getCountryName();
                if (country != null) {
                    PreferencesManager.getInstance(context).putString(COUNTRY, country);
                    return country;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    country = getCountryBasedOnSimCardOrNetwork(context);
    if (country != null) {
        PreferencesManager.getInstance(context).putString(COUNTRY, country);
        return country;
    }
    return null;
}


/**
 * Get ISO 3166-1 alpha-2 country code for this device (or null if not available)
 *
 * @param context Context reference to get the TelephonyManager instance from
 * @return country code or null
 */
private static String getCountryBasedOnSimCardOrNetwork(Context context) {
    try {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        final String simCountry = tm.getSimCountryIso();
        if (simCountry != null && simCountry.length() == 2) { // SIM country code is available
            return simCountry.toLowerCase(Locale.US);
        } else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable)
            String networkCountry = tm.getNetworkCountryIso();
            if (networkCountry != null && networkCountry.length() == 2) { // network country code is available
                return networkCountry.toLowerCase(Locale.US);
            }
        }
    } catch (Exception e) {
    }
    return null;
}

4
দুঃখিত, তবে আপনার উত্তরটি সত্যিই নতুন করে লেখা দরকার। কোডটিতে প্রচুর অব্যবহারযোগ্য কোড রয়েছে।
ইচলোস

@ আইচলোস বা আপনি যুক্তি বুঝতে পারেন নি। দয়া করে আমাকে এই স্নিপেটে অব্যবহৃত কোডের 1 টি উদাহরণ দিন
নাটিভ

2
অবশ্যই আমি যুক্তিটিকে পূর্বাবস্থায় রেখেছি এবং দয়া করে এটিকে ভুল পথে নেবেন না। আমি বিশ্বাস করি যে পিপল অ্যাপ, প্রিফেরনেস ম্যানেজার ইত্যাদি সরানো যেতে পারে এবং প্রস্তাবিত সমাধানটি পাঠকদের কাছে কিছুটা স্পষ্ট হতে পারে।
আইচলোস

পিপল অ্যাপ সম্পর্কে @ আইচলস আমি আপনার সাথে 100% সম্মত, আমি কেবল এটি সরিয়ে দিই
নাটিভ

নেই country = addresses.get(0).getCountryName();আপনার কোড, যা পরিবর্তনশীল দেশকে পুরো নাম করা হবে country। পদ্ধতিতে একই সাথে আপনি getCountryBasedOnSimCardOrNetwork(Context context)দেশের আইএসও কোডটি ফিরিয়ে দিচ্ছেন। আমি বিশ্বাস করি যে আপনি লিখতে চেয়েছিলেন country = addresses.get(0).getCountryCode();:-)
ফিরজেন

15

আপনি ব্যবহার করতে পারে getNetworkCountryIso()থেকেTelephonyManager দেশ ফোন বর্তমানে পেতে (যদিও দৃশ্যত এই সিডিএমএ নেটওয়ার্কের উপর ভরসা করা যায়)।


এটি বেশ সোজা বলে মনে হচ্ছে এবং প্রথমদিকে এমুলেটারে ভাল কাজ করেছে - আপনি কেবল ব্যাখ্যা করতে পারেন কেন এটি সিডিএমএ নেটওয়ার্কগুলিতে অবিশ্বাস্য?
ডনগ্রু

আহ ঠিক আছে, আমি পেয়েছি - কারণ ডকুমেন্টেশন তাই বলেছে :)
ডোনগ্রু

অ্যাপ্লিকেশনটির কারণে এটি কোনও সেরা সমাধান হতে পারে না কারণ কোনও ব্যবহারকারী যখন বিদেশে ভ্রমণ করেন তখন তাদের ডিফল্ট ইউনিটটি পরিবর্তিত হবে। ফোনের লোকেল সেটিংসের উপর ভিত্তি করে একটি স্থিতিশীল ডিফল্ট ইউনিট থাকা আরও বোধগম্য হবে, যা অবশ্যই কোথাও কোথাও সেটিং-এ পরিবর্তন করা যেতে পারে।
স্টিলথকপ্টার

5
String locale = context.getResources().getConfiguration().locale.getCountry(); 

অবচয় করা হয়। পরিবর্তে এটি ব্যবহার করুন:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = context.getResources().getConfiguration().getLocales().get(0);
} else {
    locale = context.getResources().getConfiguration().locale;
}

1
এটির কি অনুমতি প্রয়োজন এবং এটি কোন দেশ দেখায়?
কুলমাইন্ড

4

কিছু ডিভাইসের জন্য, যদি ডিফল্ট ভাষা পৃথক করে থাকে (কোনও ভারতীয় তখন ইংরেজী (মার্কিন) সেট করতে পারে)

context.getResources().getConfiguration().locale.getDisplayCountry();

ভুল মান দেবে। সুতরাং এই পদ্ধতিটি নির্ভরযোগ্য নয়

এছাড়াও, টেলিফনিম্যানেজারের getNetworkCountryIso () পদ্ধতি সিম কার্ড (ডাব্লুআইপিআই ট্যাবলেট) নেই এমন ডিভাইসে কাজ করবে না।

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

দেশটি যাচাই করার জন্য ব্যবহৃত নমুনা কোডটি ভারত বা না (টাইম জোন আইডি: এশিয়া / কলকাতা)

private void checkCountry() {


    TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (telMgr == null)
        return;

    int simState = telMgr.getSimState();

    switch (simState) {
        //if sim is not available then country is find out using timezone id
        case TelephonyManager.SIM_STATE_ABSENT:
            TimeZone tz = TimeZone.getDefault();
            String timeZoneId = tz.getID();
            if (timeZoneId.equalsIgnoreCase(Constants.INDIA_TIME_ZONE_ID)) {
               //do something
            } else {
               //do something
            }
            break;

            //if sim is available then telephony manager network country info is used
        case TelephonyManager.SIM_STATE_READY:

           TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
            if (tm != null) {
                String countryCodeValue = tm.getNetworkCountryIso();
                //check if the network country code is "in"
                if (countryCodeValue.equalsIgnoreCase(Constants.NETWORK_INDIA_CODE)) {
                   //do something
                }

                else {
                   //do something
                }

            }
            break;

    }
}

1
দুর্দান্ত ধারণা তবে টাইম জোন কোনও দেশের নির্দিষ্ট বৈশিষ্ট্য নয় যা আপনি জানেন? মেরিডিয়ানদের প্রতি 15 ডিগ্রির জন্য অন্য সময় অঞ্চল ইত্যাদি রয়েছে
গুণহান

3

অক্ষাংশ এবং দ্রাঘিমাংশ সহ জিপিএস ব্যবহার করে আমরা দেশের কোডটি পেতে পারি।

যদি আমরা টেলিফোনি ব্যবহার করি তবে ভাষা ব্যবহারের ভিত্তিতে আমরা সিম কার্ড এবং লোকলে ব্যবহার না করলে এটি কার্যকর হবে না, এটি দেশের কোডটি ভুল উপায়ে দেখায়।

MainActivity.java:

    GPSTracker gpsTrack;
    public static double latitude = 0;
    public static double longitude = 0;

    gpsTrack = new GPSTracker(TabHomeActivity.this);

        if (gpsTrack.canGetLocation()) {
            latitude = gpsParty.getLatitude();
            longitude = gpsParty.getLongitude();

            Log.e("GPSLat", "" + latitude);
            Log.e("GPSLong", "" + longitude);

        } else {
            gpsTrack.showSettingsAlert();

            Log.e("ShowAlert", "ShowAlert");

        }

        countryCode = getAddress(TabHomeActivity.this, latitude, longitude);

        Log.e("countryCode", ""+countryCode);

   public String getAddress(Context ctx, double latitude, double longitude) {
    String region_code = null;
    try {
        Geocoder geocoder = new Geocoder(ctx, Locale.getDefault());
        List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
        if (addresses.size() > 0) {
            Address address = addresses.get(0);


            region_code = address.getCountryCode();


        }
    } catch (IOException e) {
        Log.e("tag", e.getMessage());
    }

    return region_code;
}

GPSTracker.java:

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

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

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }



    public void showSettingsAlert() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        mContext.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.cancel();
                    }
                });
        final AlertDialog alert = builder.create();
        alert.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

লগইন করুন:

ই / কান্ট্রি কোড: IN

সম্পাদনা করুন: আরও ভাল ফলাফলের জন্য অক্ষাংশ এবং দ্রাঘিমাংশ আপডেট পেতে ফিউজড অবস্থান সরবরাহকারীর ব্যবহার করুন


জিপিএস পার্টি () কী? এটি সংজ্ঞায়িত করা হয়নি
নিকোলা সি

-2

আমি জিওআইপি ডিবি ব্যবহার করেছি এবং একটি ফাংশন তৈরি করেছি। আপনি এই লিঙ্কটি সরাসরি ব্যবহার করতে পারেন http://jamhubsoftware.com/geoip/getcountry.php

{"country":["India"],"isoCode":["IN"],"names":[{"de":"Indien","en":"India","es":"India","fr":"Inde","ja":"\u30a4\u30f3\u30c9","pt-BR":"\u00cdndia","ru":"\u0418\u043d\u0434\u0438\u044f","zh-CN":"\u5370\u5ea6"}]}

আপনি https://dev.maxmind.com/geoip/geoip2/geolite2/ থেকে autoload.php এবং .mmdb ফাইলটি ডাউনলোড করতে পারেন

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$ip_address = $_SERVER['REMOTE_ADDR'];
//$ip_address = '3.255.255.255';

require_once 'vendor/autoload.php';

use GeoIp2\Database\Reader;

// This creates the Reader object, which should be reused across
// lookups.
$reader = new Reader('/var/www/html/geoip/GeoLite2-City.mmdb');

// Replace "city" with the appropriate method for your database, e.g.,
// "country".
$record = $reader->city($ip_address);

//print($record->country->isoCode . "\n"); // 'US'
//print($record->country->name . "\n"); // 'United States'
$rows['country'][] = $record->country->name;
$rows['isoCode'][] = $record->country->isoCode;
$rows['names'][] = $record->country->names;
print json_encode($rows);
//print($record->country->names['zh-CN'] . "\n"); // '美国'
//
//print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
//print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
//
//print($record->city->name . "\n"); // 'Minneapolis'
//
//print($record->postal->code . "\n"); // '55455'
//
//print($record->location->latitude . "\n"); // 44.9733
//print($record->location->longitude . "\n"); // -93.2323
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.