লোকেশনম্যানেজারের জন্য অ্যান্ড্রয়েড চেকের অনুমতি


97

আমি যখন আমার ক্রিয়াকলাপের বিন্যাসে একটি বোতাম ক্লিক করি তখন জিপিএসের স্থানাঙ্কগুলি প্রদর্শনের চেষ্টা করি। নিম্নলিখিত বোতামটি ক্লিক করার পরে কল করা পদ্ধতি:

public void getLocation(View view) {
    TextView tv = (TextView) findViewById(R.id.gps_coord_view);
    LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
    Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}

আমি বলছি যে একটি ত্রুটি পেয়েছি

কলটির অনুমতির প্রয়োজন যা ব্যবহারকারীর দ্বারা প্রত্যাখ্যাত হতে পারে। অনুমতি পাওয়া যায় কিনা তা দেখতে কোডের স্পষ্টত চেক করা উচিত।

আমি ইতিমধ্যে আমার মধ্যে এই অনুমতিগুলি মঞ্জুর করেছি AndroidManifest। ত্রুটির যত্ন নেওয়া হয় এবং অ্যাপটি সংকলন করে আমি ফোন করার আগে নিম্নলিখিতগুলি যুক্ত করি lm.getLastKnownLocation:

if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    return;
}

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


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

4
ContextCompat.checkSelfPermission (প্রসঙ্গ, অনুমতি) ব্যবহার করুন এবং নিশ্চিত করুন যে আপনি যথাযথ অনুমতিগুলি ম্যানিফেস্টে উল্লেখ করেছেন
স্নেহাল পোয়েরেকার

উত্তর:


151

অ্যান্ড্রয়েড এপিআই স্তর (23) সহ, আমাদের অনুমতিগুলি পরীক্ষা করতে হবে। https://developer.android.com/training/permission/requesting.html

আমার আপনার একই সমস্যা ছিল, তবে নিম্নলিখিতগুলি আমার পক্ষে কাজ করেছিল এবং আমি অবস্থান ডেটা সফলভাবে পুনরুদ্ধার করতে সক্ষম হয়েছি:

(1) আপনার ম্যানিফেস্টে আপনার অনুমতি তালিকাভুক্ত রয়েছে তা নিশ্চিত করুন:

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

(২) আপনি ব্যবহারকারীর কাছ থেকে অনুমতি চেয়েছেন তা নিশ্চিত করুন:

if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {

            ActivityCompat.requestPermissions( this, new String[] {  android.Manifest.permission.ACCESS_COARSE_LOCATION  },
                                                LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION );
        }

(3) নিশ্চিত করুন যে আপনি কনটেক্সট কমপ্যাট ব্যবহার করেছেন কারণ এটির পুরানো এপিআই স্তরের সাথে সামঞ্জস্য রয়েছে।

(৪) আপনার অবস্থান পরিষেবাতে বা ক্লাসে যা আপনার লোকেশনম্যানেজারটি আরম্ভ করে এবং সর্বশেষ পরিচিত স্থানটি পায়, আমাদের অনুমতিগুলি পরীক্ষা করতে হবে:

if ( Build.VERSION.SDK_INT >= 23 &&
             ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
             ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return  ;
        }

(5) আমি @TargetApi (23) কে আমার initLocationService পদ্ধতির শীর্ষে অন্তর্ভুক্ত করার পরে এই পদ্ধতিটি কেবল আমার পক্ষে কাজ করেছে।

()) আমি এটিকে আমার গ্রেড বিল্ডে যুক্ত করেছি:

compile 'com.android.support:support-v4:23.0.1'

এখানে রেফারেন্সের জন্য আমার অবস্থানসেবা:

public class LocationService implements LocationListener  {

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

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

    private final static boolean forceNetwork = false;

    private static LocationService instance = null;

    private LocationManager locationManager;
    public Location location;
    public double longitude;
    public double latitude; 


    /**
     * Singleton implementation
     * @return
     */
    public static LocationService getLocationManager(Context context)     {
        if (instance == null) {
            instance = new LocationService(context);
        }
        return instance;
    }

    /**
     * Local constructor
     */
    private LocationService( Context context )     {

        initLocationService(context); 
        LogService.log("LocationService created");
    }



    /**
     * Sets up location service after permissions is granted
     */
    @TargetApi(23)
    private void initLocationService(Context context) {


        if ( Build.VERSION.SDK_INT >= 23 &&
             ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
             ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return  ;
        }

        try   {
            this.longitude = 0.0;
            this.latitude = 0.0;
            this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

            // Get GPS and network status
            this.isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            this.isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (forceNetwork) isGPSEnabled = false;

            if (!isNetworkEnabled && !isGPSEnabled)    {
                // cannot get location
                this.locationServiceAvailable = false;
            }
            //else
            {
                this.locationServiceAvailable = true;

                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if (locationManager != null)   {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        updateCoordinates();
                    }
                }//end if

                if (isGPSEnabled)  {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    if (locationManager != null)  {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        updateCoordinates();
                    }
                }
            }
        } catch (Exception ex)  {
            LogService.log( "Error creating location service: " + ex.getMessage() );

        }
    }       


    @Override
    public void onLocationChanged(Location location)     {
        // do stuff here with location object 
    }
}

আমি এ পর্যন্ত কেবল একটি অ্যান্ড্রয়েড ললিপপ ডিভাইস দিয়ে পরীক্ষা করেছি। আশা করি এটি আপনার পক্ষে কাজ করে।


4
আমি আপনার সমাধানটি পছন্দ করি, তবে আপনার উচিত হবে লোকেশনম্যানেজারটি ব্যবহারের আগে নাল কিনা, পরে নয়।
ফের

9

4
অবস্থান সার্ভিস.ওয়াইওয়াইপিআরএমআইএসশিয়ান_আসিসিএস_সিওআরএস_লোকশন আমার সাথেও কাজ করছে না।
কায়রি সান

4
@ ডেলিভ, লোকেশনসোর্স.মায়িপিআরএমআইএসএসআইএন_আসিসিএস_সিওআর_সবেশন -> আপনার নিজের ক্রিয়াকলাপে (যা ক্রিয়াকলাপটি বাস্তবায়িত করেছে Oঅনরেইভেস্টপ্রেরেশনসেলসটেলব্যাক) শ্রেণিতে আপনাকে এই আইটি কোডটি সংজ্ঞায়িত করতে হবে, বিশদের জন্য দয়া করে এই লিঙ্কটি পরীক্ষা করুন
1:36

11
কোর্স কোর্স নয়
ক্রিস কক্স

47

সহজ সমাধান

আমি অ্যাপগুলিতে প্রাক এপি 23 সমর্থন করতে চেয়েছিলাম এবং এর পরিবর্তে checkSelfPermissionআমি চেষ্টা / ধরা ব্যবহার করেছি

try {
   location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
} catch (SecurityException e) {
   dialogGPS(this.getContext()); // lets the user know there is a problem with the gps
}

39

আপনার উদ্ধৃত ত্রুটি বার্তার শেষ অংশটি বলে: ...with ("checkPermission") or explicitly handle a potential "SecurityException"

আপনার অনুমতি আছে কিনা তা যাচাইয়ের একটি আরও দ্রুত / সহজ উপায় হল আপনার কোডটি ঘিরে রাখা try { ... } catch (SecurityException e) { [insert error handling code here] }। আপনার যদি অনুমতি থাকে তবে 'চেষ্টা করুন' অংশটি কার্যকর করা হবে, যদি আপনি না করেন তবে 'ধরা' অংশটি হবে।


4
আপনার যদি কোনও ক্রিয়াকলাপ বা প্রসঙ্গ অবজেক্ট না থাকে তবে আপনি এর জন্য অনুমতিগুলি পরীক্ষা করতে পারেন Use
নুব্লুডোলেভোপার

7

পার্সিসনটি পরীক্ষা করতে বা অনুরোধ করতে আমার পণ্য শ্রেণি ব্যবহার করুন

public class Permissons {

        //Request Permisson
        public static void Request_STORAGE(Activity act,int code)
        {

            ActivityCompat.requestPermissions(act, new
                    String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},code);
        }
        public static void Request_CAMERA(Activity act,int code)
        {
            ActivityCompat.requestPermissions(act, new
                    String[]{Manifest.permission.CAMERA},code);
        }
        public static void Request_FINE_LOCATION(Activity act,int code)
        {
            ActivityCompat.requestPermissions(act, new
                    String[]{Manifest.permission.ACCESS_FINE_LOCATION},code);
        }
        public static void Request_READ_SMS(Activity act,int code)
        {
            ActivityCompat.requestPermissions(act, new
                    String[]{Manifest.permission.READ_SMS},code);
        }
        public static void Request_READ_CONTACTS(Activity act,int code)
        {
            ActivityCompat.requestPermissions(act, new
                    String[]{Manifest.permission.READ_CONTACTS},code);
        }
        public static void Request_READ_CALENDAR(Activity act,int code)
        {
            ActivityCompat.requestPermissions(act, new
                    String[]{Manifest.permission.READ_CALENDAR},code);
        }
        public static void Request_RECORD_AUDIO(Activity act,int code)
        {
            ActivityCompat.requestPermissions(act, new
                    String[]{Manifest.permission.RECORD_AUDIO},code);
        }

        //Check Permisson
        public static boolean Check_STORAGE(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act,android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        public static boolean Check_CAMERA(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act, Manifest.permission.CAMERA);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        public static boolean Check_FINE_LOCATION(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act, Manifest.permission.ACCESS_FINE_LOCATION);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        public static boolean Check_READ_SMS(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act, Manifest.permission.READ_SMS);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        public static boolean Check_READ_CONTACTS(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act, Manifest.permission.READ_CONTACTS);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        public static boolean Check_READ_CALENDAR(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act, Manifest.permission.READ_CALENDAR);
            return result == PackageManager.PERMISSION_GRANTED;
        }
        public static boolean Check_RECORD_AUDIO(Activity act)
        {
            int result = ContextCompat.checkSelfPermission(act, Manifest.permission.RECORD_AUDIO);
            return result == PackageManager.PERMISSION_GRANTED;
        }
    }

উদাহরণ

if(!Permissons.Check_STORAGE(MainActivity.this))
{
   //if not permisson granted so request permisson with request code
   Permissons.Request_STORAGE(MainActivity.this,22);
}

ধন্যবাদ, তবে আমি জিজ্ঞাসা করতে চাই, "ইনট কোড" এর কাজ কী?
হেন্ড্রো প্রমোনো

এই কোডটি ব্যবহারের অনুমতি প্রদান বা ক্রিয়াকলাপের ফলাফলকে হ্রাস করার জন্য ব্যবহার করুন
মিলন পিঠাদিয়া

4

আপনি যদি গতিশীল অনুমতি এবং ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION মত ত্রুটি দেওয়ার মতো কোনও অনুমতি নিয়ে কাজ করছেন তবে "PERMISSION_NAME পদ্ধতিটি সমাধান করতে পারে না" এই ক্ষেত্রে আপনাকে অনুমতি নাম দিয়ে কোড লিখতে পারে এবং আপনার প্রকল্পটি পুনর্নির্মাণ করতে পারে এটি ম্যানিফেস্ট (ম্যানিফেস্ট.প্রেমিশন) ফাইলটিকে পুনরায় জেনারেট করবে।


0

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

fun BaseActivity.checkPermission(permissionName: String): Boolean {
        return if (Build.VERSION.SDK_INT >= 23) {
            val granted =
                ContextCompat.checkSelfPermission(this, permissionName)
            granted == PackageManager.PERMISSION_GRANTED
        } else {
            val granted =
                PermissionChecker.checkSelfPermission(this, permissionName)
            granted == PermissionChecker.PERMISSION_GRANTED
        }
    }

এখন, আমি যদি কোনও অনুমতি যাচাই করতে চাই তবে আমি এ জাতীয় অনুমতিতে সহজভাবে পাস করতে পারি:

checkPermission(Manifest.permission.READ_CONTACTS)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.