আমি কীভাবে জিপিএস রিসিভারের বর্তমান অবস্থা পরীক্ষা করতে পারি?


90

আমি কীভাবে জিপিএস রিসিভারের বর্তমান অবস্থা পরীক্ষা করতে পারি? আমি ইতিমধ্যে LocationListener onStatusChangedপদ্ধতিটি পরীক্ষা করেছি তবে একরকম মনে হচ্ছে এটি কাজ করছে না, বা কেবল ভুল সম্ভাবনা।

মূলত আমার কেবল পাতাগুলির শীর্ষে থাকা জিপিএস আইকনটি জ্বলজ্বলে করছে (কোনও প্রকৃত ফিক্স নেই) বা শক্ত (ফিক্স উপলব্ধ রয়েছে) তা জানতে হবে।

উত্তর:


150

স্পিডভিউ এর বিকাশকারী: অ্যান্ড্রয়েডের জন্য জিপিএস স্পিডোমিটার, আমি অবশ্যই এই সমস্যাটির প্রতিটি সম্ভাব্য সমাধান চেষ্টা করেছি, সবগুলি একই নেতিবাচক ফলাফল সহ। আসুন পুনরায় বলি যা কাজ করে না:

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

সুতরাং আমি খুঁজে পাওয়া একমাত্র কার্যকরী সমাধান এবং আমি আমার অ্যাপ্লিকেশনটিতে এটি ব্যবহার করি। ধরা যাক আমাদের এই সাধারণ ক্লাসটি রয়েছে যা GpsStatus.Listener প্রয়োগ করে:

private class MyGPSListener implements GpsStatus.Listener {
    public void onGpsStatusChanged(int event) {
        switch (event) {
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                if (mLastLocation != null)
                    isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

                if (isGPSFix) { // A fix has been acquired.
                    // Do something.
                } else { // The fix has been lost.
                    // Do something.
                }

                break;
            case GpsStatus.GPS_EVENT_FIRST_FIX:
                // Do something.
                isGPSFix = true;

                break;
        }
    }
}

ঠিক আছে, এখন onLocationChanged () এ আমরা নিম্নলিখিতগুলি যুক্ত করি:

@Override
public void onLocationChanged(Location location) {
    if (location == null) return;

    mLastLocationMillis = SystemClock.elapsedRealtime();

    // Do something.

    mLastLocation = location;
}

এবং এটাই. মূলত, এই লাইনটি এটি সবই করে:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

আপনি অবশ্যই মিলিস মানটি টুইঙ্ক করতে পারেন, তবে আমি এটি প্রায় 3-5 সেকেন্ডের মধ্যে সেট করার পরামর্শ দেব।

এটি আসলে কাজ করে এবং যদিও আমি উত্স কোডের দিকে নজর রাখিনি যা নেটিভ জিপিএস আইকনটি আঁকছে, এটি এর আচরণের প্রতিরূপ করতে কাছে আসে। আশা করি এটি কাউকে সাহায্য করবে।


হাই, আমি ভাবছি যে উপলব্ধ উপগ্রহ গণনা এই উদাহরণের মতো কেন অকেজো? যদি স্যাটেলাইটের সন্ধান পাওয়া যায় তবে 0 এর অর্থ কোনও সংযোগ নেই, বা আমি ভুল করছি? গ্রুপ.google.com/group/android-developers/browse_thread/thread/…
per_jansson

4
হাই স্টিফেন, আপনি কেন জিপিএসফিক্স কাজ করে তা ব্যাখ্যা করতে পারেন । ধন্যবাদ, নিক
নিকফক্স

যাইহোক, আমি লক্ষ্য করেছি যে আইসিএসে তারা সময় বাড়িয়েছে যতক্ষণ না সিস্টেম রিপোর্ট শুরু করে যে জিপিএস ফিক্স হারিয়ে গেছে। কমপক্ষে 4.0.3 এ এটি অবিকল 10 সেকেন্ড।
সাউন্ডমেভেন

দুর্দান্ত কাজ করে এবং আইসিএসের জন্য 3-5 এর বিপরীতে 10 সেকেন্ড ব্যবহার করাও বেশ ভাল কাজ করে। ভাগ্যক্রমে ঠিক করা আমার অ্যাপ্লিকেশনটির প্রয়োজনীয় বৈশিষ্ট্য নয় তবে এটি জানতে সক্ষম হওয়ায় এটি ভাল good ধন্যবাদ
টম

4
কিন্তু mLastLocationMillisজিপিএস ব্যতীত অন্য কোনও সূত্র যখন সেট করেছিল তখন কি এই ব্রেক হয় না ? সিস্টেমটি দাবি করার চেয়ে isGPSFixসত্য যে সত্য তবে বাস্তবে এটি কোনও স্থির (সম্ভবত ফোনের নেটওয়ার্ক থেকে একটি)
অবলঞ্চ

25

জিপিএস আইকনটি প্রাপ্ত সম্প্রচারের অভিপ্রায় অনুসারে এর রাজ্য পরিবর্তন করবে বলে মনে হচ্ছে। নিম্নলিখিত কোডের নমুনাগুলির সাহায্যে আপনি নিজেই এর রাজ্য পরিবর্তন করতে পারেন:

জিপিএস সক্ষম হয়েছে তা জানিয়ে দিন:

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

জিপিএস ফিক্সগুলি গ্রহণ করছে তা অবহিত করুন:

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

বিজ্ঞপ্তি দিন যে জিপিএস আর ফিক্স গ্রহণ করছে না:

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

জিপিএস অক্ষম করা হয়েছে তা জানান:

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

উদ্দেশ্যগুলিতে রিসিভারটি নিবন্ধকরণের জন্য কোডের উদাহরণ:

// MyReceiver must extend BroadcastReceiver
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("android.location.GPS_ENABLED_CHANGE");
filter.addAction("android.location.GPS_FIX_CHANGE");
registerReceiver(receiver, filter);

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


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

উত্তরটি যখন লিখেছিলাম তখন ছয় বছর আগে এটি পাঠানো সম্ভব হয়েছিল। স্পষ্টতই তারা তখন থেকেই সিস্টেমে কিছুটা সুরক্ষা জুড়েছে।
sast

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

হ্যাঁ আমি সেই ক্র্যাশ পেয়েছি: 05-14 10: 25: 24.113 17344-17344 / xxx.yyy.zzz.debug ই / অ্যান্ড্রয়েড রুনটাইম: চূড়ান্ত ব্যতিক্রম: প্রধান প্রক্রিয়া: xxx.yyy.zzz.debug, পিআইডি: 17344 জাভা। ল্যাং.সিকিউরিটি এক্সেপশন: অনুমতি অস্বীকার: সম্প্রচার android.location.GPS_FIX_CHANGE থেকে পিড = 17344, ইউআইডি = 10416
আনলিমিটেড

19

নতুন সদস্য যাতে দুর্ভাগ্যক্রমে আমি মন্তব্য করতে বা ভোট দিতে অক্ষম, তবে উপরের স্টিফেন ডেয়ের পোস্টটি হ'ল আমি ঠিক যে সমস্যার সাথে সাহায্য চাইছিলাম তার সঠিক সমাধান ছিল।

নিম্নলিখিত লাইনে একটি ছোট পরিবর্তন:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

প্রতি:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

মূলত যখন আমি একটি ধীর গতি সম্পন্ন গেমটি তৈরি করছি এবং আমার আপডেটের ব্যবধানটি ইতিমধ্যে 5 সেকেন্ডে সেট হয়ে গেছে, একবার জিপিএস সিগন্যালটি 10+ সেকেন্ডের জন্য বের হয়ে যায়, তখন কোনও কিছুকে ট্রিগার করার জন্য সঠিক সময় হয়।

চিয়ার্স সাথী, আমি আপনার পোস্টটি খুঁজে পাওয়ার আগেই এই সমাধানটি সমাধানের চেষ্টা করতে প্রায় 10 ঘন্টা ব্যয় করেছি :)


14

ঠিক আছে, সুতরাং এখন পর্যন্ত সমস্ত উত্তর এবং আপডেটের সংমিশ্রণ চেষ্টা করি এবং এর মতো কিছু করি:

  • ACCESS_FINE_LOCATIONআপনার ম্যানিফেস্টে অনুমতি যুক্ত করুন
  • সিস্টেমের একটি উদাহরণ পান LocationManager
  • GpsStatus.Listenerপ্রতিক্রিয়াযুক্ত একটি তৈরি করুনGPS_EVENT_SATELLITE_STATUS
  • LocationManagerসাথে শ্রোতার সাথে নিবন্ধন করুনaddGpsStatusListener

জিপিএস শ্রোতা এরকম কিছু হতে পারে:

GpsStatus.Listener listener = new GpsStatus.Listener() {
    void onGpsStatusChanged(int event) {
        if (event == GPS_EVENT_SATELLITE_STATUS) {
            GpsStatus status = mLocManager.getGpsStatus(null);
            Iterable<GpsSatellite> sats = status.getSatellites();
            // Check number of satellites in list to determine fix state
        }
    }
}

জিপিএস এবং উপগ্রহের তথ্য কখন এবং কী দেওয়া হয় সে সম্পর্কে API গুলি কিছুটা অস্পষ্ট, তবে আমি মনে করি যে কতগুলি উপগ্রহ পাওয়া যায় তা দেখার জন্য একটি ধারণা হবে idea যদি এটি তিনটির নিচে থাকে তবে আপনার কোনও স্থিরতা নেই। যদি এটি আরও বেশি হয় তবে আপনার একটি ঠিক করা উচিত।

অ্যান্ড্রয়েড কত ঘন ঘন উপগ্রহ সম্পর্কিত তথ্য প্রতিবেদন করে এবং প্রতিটি GpsSatelliteবস্তুর মধ্যে কী তথ্য রয়েছে তা নির্ধারণ করার জন্য সম্ভবত ট্রায়াল এবং ত্রুটি সম্ভবত the


উপলভ্য উপগ্রহ গণনা করার ক্ষেত্রে সমস্যাটি হ'ল, আপনার কাছে 5 টি উপগ্রহ দেখার পরেও এর অর্থ এই নয় যে কোনও স্থির করা সবসময় সম্ভব। (আপনি "এটি যদি আরও বেশি হয় তবে আপনার ঠিক করা উচিত " লিখে এটি সঠিক উল্লেখ করেছেন )
এনআর 1

প্রকৃতপক্ষে. যদিও কোনও স্থির গঠনের জন্য কোন তথ্যের প্রয়োজন হয় বা কীভাবে / এটি কোনও GpsSatelliteবস্তু থেকে পুনরুদ্ধার করা যায় সে সম্পর্কে আমি আর কিছু জানি না ।
ক্রিস্টোফার অর

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

4
"স্যাটস" ইটারেট করা এবং জিপিএসসেটেলে ব্যবহৃত ইনফিক্স () পরীক্ষা করা হতে পারে?
ডিলিরিয়ামট্রেমেন্স

8

উইন্ডোজ মোবাইলে জিপিএস নিয়ে কয়েক বছর কাজ করার পরে, আমি বুঝতে পেরেছিলাম যে একটি জিপিএস ফিক্সকে "হারানোর" ধারণাটি বিষয়গত হতে পারে। জিপিএস আপনাকে যা বলেছে কেবল তা শোনার জন্য, একটি এনএমইএলইস্টেনার যুক্ত করে বাক্যটি বিশ্লেষণ করলে আপনাকে জানানো হবে যে এই ফিক্সটি "বৈধ" ছিল কি না। Http://www.gpsinformation.org/dale/nmea.htm#GGA দেখুন । দুর্ভাগ্যক্রমে কিছু জিপিএস দিয়ে এই মানটি "ভাল ফিক্স" অঞ্চলে পরিচালনার স্বাভাবিক কোর্স চলাকালীনও পিছনে পিছলে যায়।

সুতরাং, অন্য সমাধানটি ফোনের সময়ের (ইউটিসিতে রূপান্তরিত) জিপিএস অবস্থানের ইউটিসি সময়ের সাথে তুলনা করা। যদি এগুলির একটি নির্দিষ্ট সময়ের পার্থক্য থাকে তবে ধরে নিতে পারেন আপনি জিপিএসের অবস্থানটি হারিয়েছেন।


আপনি সময় তুলনা পদ্ধতি ব্যাখ্যা যত্ন নেবেন? স্টিফেন ডেয়ের উত্তরে, তিনি শেষ ফিক্সটি কখন ঘটেছিল এবং সর্বশেষ GPS_EVENT_SATELLITE_STATUS ইভেন্টের মধ্যে সময়ের পার্থক্যের তুলনা করেছেন ... এটি কী পরিমাপ করছে তা নিশ্চিত নয়।
রোকে জি

7

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

private class MyGPSListener implements GpsStatus.Listener {
    public void onGpsStatusChanged(int event) {
        switch (event) {
        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            if (Global.getInstance().currentGPSLocation != null)
            {
                if((SystemClock.elapsedRealtime() - mLastLocationMillis) < 20000)
                {
                    if (!hasGPSFix) 
                        Log.i("GPS","Fix Acquired");
                    hasGPSFix = true;
                } 
                else
                {
                    if (hasGPSFix) 
                    {
                        Log.i("GPS","Fix Lost (expired)");
                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
                    }
                    hasGPSFix = false;
                }
            }
            break;
        case GpsStatus.GPS_EVENT_FIRST_FIX:
            Log.i("GPS", "First Fix/ Refix");
            hasGPSFix = true;
            break;
        case GpsStatus.GPS_EVENT_STARTED:
            Log.i("GPS", "Started!");
            break;
        case GpsStatus.GPS_EVENT_STOPPED:
            Log.i("GPS", "Stopped");
            break;
        }
    }
}

5

ঠিক আছে, প্রতিটি কার্যনির্বাহী পদ্ধতির একত্রে রাখার ফলস্বরূপ এটি (অবমূল্যায়নের সাথেও আচরণ করবে GpsStatus.Listener):

private GnssStatus.Callback mGnssStatusCallback;
@Deprecated private GpsStatus.Listener mStatusListener;
private LocationManager mLocationManager;

@Override
public void onCreate() {
    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    if (checkPermission()) {
       mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_UPDATE_INTERVAL, MIN_DISTANCE, this);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        mGnssStatusCallback = new GnssStatus.Callback() {
            @Override
            public void onSatelliteStatusChanged(GnssStatus status) {
                satelliteStatusChanged();
            }

            @Override
            public void onFirstFix(int ttffMillis) {
                gpsFixAcquired();

            }
        };
        mLocationManager.registerGnssStatusCallback(mGnssStatusCallback);
    } else {
        mStatusListener = new GpsStatus.Listener() {
            @Override
            public void onGpsStatusChanged(int event) {
                switch (event) {
                    case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                        satelliteStatusChanged();
                        break;
                    case GpsStatus.GPS_EVENT_FIRST_FIX:
                        // Do something.
                        gpsFixAcquired();
                        break;
                }
            }
        };
        mLocationManager.addGpsStatusListener(mStatusListener);
    }
}

private void gpsFixAcquired() {
    // Do something.
    isGPSFix = true;
}

private void satelliteStatusChanged() {
    if (mLastLocation != null)
        isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

    if (isGPSFix) { // A fix has been acquired.
        // Do something.
    } else { // The fix has been lost.
        // Do something.
    }
}

@Override
public void onLocationChanged(Location location) {
    if (location == null) return;

    mLastLocationMillis = SystemClock.elapsedRealtime();

    mLastLocation = location;
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}

দ্রষ্টব্য: এই উত্তরটি উপরের উত্তরগুলির সংমিশ্রণ।


4
যতক্ষণ আপনি অন্য লেখক (গুলি) কে ক্রেডিট করেন, ততক্ষণ নতুন বা ডেরিভেটিভ কাজের জন্য আপনার নিজস্ব মূল্যায়ন করতে কোনও সমস্যা নেই। এখানকার নিয়মগুলি লোকেরা অন্য লোকদের জবাব চুরি করার বিষয়ে এবং উদ্বেগকে অসাধুভাবে আকর্ষণ করার জন্য স্ট্যাক ওভারফ্লোতে অন্য কোথাও তাদের ব্যবহার করার বিষয়ে আরও উদ্বিগ্ন। যেহেতু আপনি অন্যান্য উত্তরগুলিতে তৈরি করেছেন বলে উল্লেখ করেছেন, আমার মনে হয় এটি ঠিক আছে।
অর্ধবার

3

যদি আপনার ঠিক ঠিক আছে কিনা তা জানতে হবে, তবে জিপিএস রিসিভারের দ্বারা প্রদত্ত সর্বশেষ জ্ঞাত অবস্থানটি যাচাই করুন এবং এটি কত পুরানো তা জানতে .getTime () মানটি পরীক্ষা করুন check যদি এটি সাম্প্রতিক পর্যায়ে থাকে (যেমন ... কয়েক সেকেন্ড) তবে আপনার একটি ঠিক আছে।

   LocationManager lm = (LocationManager)context.getSystemService(LOCATION_SERVICE); 
   Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

   // Get the time of the last fix
   long lastFixTimeMillis = loc.getTime(); 

... এবং শেষ পর্যন্ত এটি বর্তমান তারিখের সময়ের সাথে (ইউটিসি তে!) তুলনা করুন। যদি এটি সাম্প্রতিক পর্যায়ে থাকে তবে আপনার একটি ঠিক আছে।

আমি আমার অ্যাপে এটি করি এবং এখন পর্যন্ত খুব ভাল।


আপনি যদি তাত্ক্ষণিকভাবে ঠিক করতে চান কিনা তা জানতে চাইলে +1 চেষ্টা করে দেখার মতো বলে মনে হচ্ছে।
এজেন্টকনফফ

2

ব্যবহার করে আপনি চেষ্টা করে দেখতে পারেন LocationManager.addGpsStatusListener জিপিএস স্থিতির পরিবর্তনগুলি যখন আপডেট পেতে। দেখে মনে হচ্ছে GPS_EVENT_STARTED এবং GPS_EVENT_STOPPED আপনি যা খুঁজছেন তা হতে পারে।


4
একটি স্ট্যাটাস শ্রোতার GPS_EVENT_FIRST_FIXকাছাকাছি ফিট মত শব্দ সঙ্গে মিলিত ।
ক্রিস্টোফার অর

2

আমি ভুল হতে পারি তবে মনে হয় লোকেরা বিষয় ছাড়িয়ে যাচ্ছে

আমার কেবল স্ক্রিনের শীর্ষে থাকা জিপিএস আইকনটি জ্বলজ্বল করছে কিনা তা জানতে হবে (কোনও আসল ঠিক নেই)

এটি সহজেই সম্পন্ন করা হয়

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_on = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

আপনার কোনও দৃ fix় স্থির রয়েছে কিনা তা দেখার জন্য, জিনিসগুলি একটি সামান্য কৌশলযুক্ত হয়:

public class whatever extends Activity {
    LocationManager lm;
    Location loc;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        loc = null;
        request_updates();        
    }

    private void request_updates() {
        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            // GPS is enabled on device so lets add a loopback for this locationmanager
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, locationListener);
        }      
    }

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Each time the location is changed we assign loc
            loc = location;
        }

         // Need these even if they do nothing. Can't remember why.
         public void onProviderDisabled(String arg0) {}
         public void onProviderEnabled(String provider) {}
         public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

এখন যখনই আপনি ঠিক করতে চান তা দেখতে চান?

if (loc != null){
    // Our location has changed at least once
    blah.....
}

যদি আপনি অভিনব হতে চান তবে আপনি সর্বদা সিস্টেম.কন্ট্রেনটাইমমিলিস () এবং লোক.জেটটাইম () ব্যবহার করে টাইমআউট করতে পারেন

কমপক্ষে 2.1 থেকে কোনও এন 1-তে নির্ভরযোগ্যভাবে কাজ করে।


4
আপনার সমাধানটি যা করে তার জন্য অতিরিক্ত কমপ্লিক্স। তবে এটি খুব অল্প করে। জিপিএস আমার অবস্থানটি সমাধানের পরে আমি যদি ভূগর্ভস্থ স্টেশনে যাই তবে জিপিএস ঠিকঠাকটি হারাবে?
meandre

1

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

এটি কি আপনাকে যথেষ্ট তথ্য দেয়?

অথবা সম্ভবত আপনি অবস্থানের সরবরাহকারীর মাধ্যমে পুনরাবৃত্তি করতে পারেন এবং প্রত্যেকে ক্রিটেরিয়া (ACCURACY_COARSE) এর সাথে দেখা করে কিনা তা জানতে পারেন


1

অনেক পোস্ট ...

GpsStatus.Listener gpsListener = new GpsStatus.Listener() {
                        public void onGpsStatusChanged(int event) {
                            if( event == GpsStatus.GPS_EVENT_FIRST_FIX){
                                showMessageDialog("GPS fixed");
                            }
                        }
                 };

এই কোডটি যুক্ত করে, অ্যাডপ্লেসপ্লাইটার সহ ... শোমেসেজডায়ালগ ... স্ট্রিং সহ কেবল একটি স্ট্যান্ডার্ড ডায়ালগ উইন্ডো দেখায়

আমার জন্য পুরোপুরি কাজটি করেছেন :) অনেক অনেক ধন্যবাদ: =) (এই পোস্টের জন্য শ্রাই, এখনও ভোট দিতে সক্ষম নন)


এটি ঠিক প্রথম ঠিক। আপনি যদি একটি টানেল প্রবেশ করেন?
লিওস লিটারাক

1

যদি আপনার খুব দ্রুত তাত্ক্ষণিকভাবে ফিক্সটি হারিয়ে যাওয়ার আপডেটের প্রয়োজন না হয় তবে আপনি স্টিফেন ডেয়ের সমাধানটি সেভাবে পরিবর্তন করতে পারেন, আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা পরীক্ষা করে এখনও উপস্থিত আছে কিনা তা পরীক্ষা করে।

সুতরাং আপনি যখনই কিছু জিপিএস ডেটা প্রয়োজন তখনই এটি পরীক্ষা করে দেখতে পারেন এবং আপনার সেই জিপিএসস্ট্যাটাস.লাইস্টেনারের দরকার নেই।

"গ্লোবাল" ভেরিয়েবলগুলি হ'ল:

private Location lastKnownLocation;
private long lastKnownLocationTimeMillis = 0;
private boolean isGpsFix = false;

এটি সেই পদ্ধতি যা আপডেটের সময় এবং বর্তমান অবস্থান মনে রাখার জন্য "onLocationChanged ()" এর মধ্যে ডাকা হয়। পাশেই এটি "isGpsFix" আপডেট করে:

private void handlePositionResults(Location location) {
        if(location == null) return;

        lastKnownLocation = location;
        lastKnownLocationTimeMillis = SystemClock.elapsedRealtime();

        checkGpsFix(); // optional
    }

জিপিএস ফিক্স আছে কিনা আমার যখনই জানতে হবে তখনই এই পদ্ধতিটি বলা হয়:

private boolean checkGpsFix(){

    if (SystemClock.elapsedRealtime() - lastKnownLocationTimeMillis < 3000) {
        isGpsFix = true;

    } else {
        isGpsFix = false;
        lastKnownLocation = null;
    }
    return isGpsFix;
}

আমার বাস্তবায়নে আমি প্রথমে চেক জিপিএসফিক্স () চালিত করি এবং ফলাফলটি সত্য হলে আমি আমার বর্তমান অবস্থান হিসাবে "লাস্টকোনডলকেশন" পরিবর্তনশীলটি ব্যবহার করি।


1

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

আরএমসি বাক্যটিতে স্থির স্থিতি রয়েছে যা হ'ল A বা ঠিকানার জন্য সতর্কতার জন্য is জিজিএ বাক্যে ফিক্স কোয়ালিটি (0 অবৈধ, 1 জিপিএস বা 2 ডিজিপিএস) রয়েছে

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

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


0

টাইমারটাস্ক তৈরির পক্ষে এটি সম্ভবত সেরা সম্ভাবনা যা নিয়মিতভাবে কোনও নির্দিষ্ট মান (নাল?) এ প্রাপ্ত স্থান নির্ধারণ করে। GPSListener দ্বারা যদি কোনও নতুন মান গৃহীত হয় তবে এটি বর্তমান ডেটা সহ অবস্থান আপডেট করবে।

আমি মনে করি এটি কার্যকর সমাধান হবে।


0

আপনি বলছেন যে আপনি ইতিমধ্যে onStatusChanged () চেষ্টা করেছেন, তবে এটি আমার পক্ষে কাজ করে না।

আমি যে পদ্ধতিটি ব্যবহার করি তা এখানে (আমি ক্লাসটি নিজেই স্ট্যাটাস চেঞ্জড পরিচালনা করতে পারি):

private void startLocationTracking() {
    final int updateTime = 2000; // ms
    final int updateDistance = 10; // meter
    final Criteria criteria = new Criteria();
    criteria.setCostAllowed(false);
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    final String p = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(p, updateTime, updateDistance,
            this);
}

এবং আমি নিম্নলিখিত হিসাবে onStatusChanged পরিচালনা করি:

void onStatusChanged(final String provider, final int status,
        final Bundle extras) {
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "No Service";
            location = null;
        }
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        if (location == null || location.getProvider().equals(provider)) {
            statusString = "no fix";
        }
        break;
    case LocationProvider.AVAILABLE:
        statusString = "fix";
        break;
    }
}

নোট করুন যে অনপ্রভাইডার {ডিস, এন} সক্ষমড () পদ্ধতিগুলি ব্যবহারকারী দ্বারা জিপিএস ট্র্যাকিং সক্ষম ও অক্ষম করার বিষয়ে; আপনি যা খুঁজছেন তা নয়


দুর্ভাগ্যক্রমে, এটি প্রায়শই কাজ করে না। onLocationChanged () সেকেন্ডে একবার কল হয়, কিন্তু onStatusChanged একেবারেই কল হয় না। কখনও কখনও আমি চাই যে আমি কোনও বিজ্ঞপ্তির জন্য অপেক্ষা না করে কেবলমাত্র বর্তমান অবস্থাটি জিজ্ঞাসা করতে পারি যা সম্ভবত দীর্ঘ সময় বা কখনও আসেনি।
এডওয়ার্ড ফ্যাল্ক

4
ঠিক আছে। পূর্ববর্তী জবাবের পরে আমি কয়েকটি জিনিস নিজেই শিখেছি এবং একটি হ'ল সমস্ত অ্যান্ড্রয়েড প্ল্যাটফর্ম একই রকম হয় না। আমি অবশ্যই আমার এইচটিসি হিরো এবং আমার আর্কোস 5 এ অন স্ট্যাটাস চ্যাঞ্জড কলগুলি দেখতে পাচ্ছি, তবে আমি অবাক হই না যে এটি সর্বত্র কার্যকর হয় না। প্ল্যান বি সম্পর্কে কীভাবে: আপনি জিপিএসএসট্যাটাসলাইস্টেনার ব্যবহার করেন যা অন্য উত্তরে দেখানো হয় এবং কেবলমাত্র উপগ্রহগুলির মধ্যে কোনও ইউজডইনফিক্স () এর জন্য সত্য হয় কিনা তা দেখুন। আমার অভিজ্ঞতায় যা স্ট্যান্ডার্ড জিপিএস আইকনটির আচরণের সবচেয়ে কাছাকাছি আসে। (আপনি কি সেই উত্স খুঁজে পাওয়ার চেষ্টা করেছেন যা সেই আদর্শ আইকন,
বিটিডাব্লু

0

স্থির জন্য পরীক্ষা করার জন্য সময় ব্যবধান নির্ধারণ করা ভাল পছন্দ নয় .. আমি লক্ষ্য করেছি যে আপনি চলতে না পারলে onLocationChanged বলা হয় না .. যেহেতু অবস্থান পরিবর্তন হচ্ছে না তাই বোঝা যায় :)

আরও ভাল উপায় উদাহরণস্বরূপ হবে:

  • শেষ স্থানের জন্য অন্তর পরীক্ষা করে দেখুন (জিপিএসস্ট্যাটাস চ্যাঞ্জড)
  • যদি সেই ব্যবধানটি 15-এরও বেশি সেট ভেরিয়েবল হয়: দীর্ঘ_ইন্টারওয়াল = সত্য
  • লোকেশন শ্রোতা অপসারণ করুন এবং এটি আবার যুক্ত করুন, সাধারণত তখন আপনি অবস্থানটি যদি সত্যিই উপলব্ধ থাকে তবে আপডেট অবস্থান পাবেন, যদি না - আপনি সম্ভবত অবস্থানটি হারিয়ে ফেলেছেন
  • onLocationChanged আপনি সবেমাত্র দীর্ঘ_মুগ্ধকে মিথ্যাতে সেট করেছেন ..
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.