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


165

আমি বর্তমানে এমন একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যার জন্য বেশ কয়েকটি "বিপজ্জনক" অনুমতি প্রয়োজন। সুতরাং আমি অ্যান্ড্রয়েড মার্শমেলোতে (পিআইপি লেভেল 23) প্রয়োজনীয় হিসাবে "অনুমতি চেয়ে জিজ্ঞাসা করুন" যুক্ত করার চেষ্টা করেছি, তবে কীভাবে এটি করব তা খুঁজে পেলাম না।

আমি কীভাবে আমার অ্যাপ্লিকেশনটিতে নতুন অনুমতি মডেল ব্যবহার করে অনুমতি চাইতে পারি?


1
এখানে একবার দেখুন, আপনার যা যা প্রয়োজন তা এটি: বিকাশকারী.অ্যান্ড্রয়েড
টমাস আর

1
এই একটি চেহারা আছে inthecheesefactory.com/blog/...
Dory তে

আপনি কি গুগলের গিটহাব রেপোতে নমুনাগুলি দেখেছেন?
ইগোরগানাপলস্কি

বিকাশকারী.অ্যান্ড্রয়েড / ট্রেনিং
স্পিকার

আমি এটির জন্য গ্রন্থাগার তৈরি করেছি। এটি সাধারণ পদক্ষেপগুলি ব্যবহার করা সহজ। github.com/Kishanjvaghela/Asc-Permission
কিশান

উত্তর:


240

নীচের কোডটি ব্যবহার করে একটি ডায়ালগ খুলুন:

 ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    1);

ক্রিয়াকলাপ নীচের হিসাবে পান:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {

          // If request is cancelled, the result arrays are empty.
          if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.          
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

আরও তথ্য: https://developer.android.com/training/permission/requesting.html


3
আমি এটির জন্য গ্রন্থাগার তৈরি করেছি। এটি সাধারণ পদক্ষেপগুলি ব্যবহার করা সহজ। github.com/Kishanjvaghela/Asc-Permission
কিশান

যদি ব্যবহারকারী ক্লিক করা বাতিল এই অংশ: যদি অন্য (grantResults.length> 0 && grantResults [0] == PackageManager.PERMISSION_DENIED)
Mehmet

হয় ActivityCompat.requestPermissionsঅবচিত? (নুগাতায়)
থান্ডারওয়্যারিং

আপনি কোথায় এই পরিবর্তনশীল পাবেন? ক্রিয়াকলাপ?
gumuruh

@ গুমুরু, কি পরিবর্তনশীল?
কুলমাইন্ড

61

এই কাঠামোটি আমি আমার অ্যাপ্লিকেশনটির অনুমতি আছে কিনা তা যাচাই করতে এবং এটির অনুমতি না থাকলে অনুরোধ চেয়ে ব্যবহার করছি। সুতরাং আমার মূল কোডটি থেকে যেখান থেকে আমি নিম্নলিখিত লেখাগুলি পরীক্ষা করতে চাই:

int MyVersion = Build.VERSION.SDK_INT;
if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
                if (!checkIfAlreadyhavePermission()) {
                    requestForSpecificPermission();
                }
}

মডিউল চেকআইএলডিগ্রাহেপার্মেশন () হিসাবে প্রয়োগ করা হয়েছে:

private boolean checkIfAlreadyhavePermission() {
    int result = ContextCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS);
    if (result == PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        return false;
    }
}

মডিউল অনুরোধের জন্য স্পেসিফিক্স পারমিশন () প্রয়োগ করা হয়েছে:

private void requestForSpecificPermission() {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.GET_ACCOUNTS, Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 101);
}

এবং ক্রিয়াকলাপে ওভাররাইড:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //granted
            } else {
                //not granted
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

আরও তথ্যের জন্য এই লিঙ্কটি দেখুন: http://revisitingandroid.blogspot.in/2017/01/how-to-check-and-request-for-run-time.html


বন্ধুত্বপূর্ণ পরামর্শ: প্রতিস্থাপন যদি বিবৃতিতে checkIfAlreadyhavePermissionকরতেreturn result == PackageManager.PERMISSION_GRANTED;
এলেন Spertus

19

আমি গুগল বিকাশকারীদের দ্বারা লিখিত এই মোড়ক (প্রস্তাবিত) ব্যবহার করেছি। এটি ব্যবহার করা খুব সহজ।

https://github.com/googlesamples/easypermissions

চেকিংয়ের সাথে কাজ করে এবং প্রয়োজনে অনুমতি চাইবে ask

public void locationAndContactsTask() {
    String[] perms = { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CONTACTS };
    if (EasyPermissions.hasPermissions(this, perms)) {
        // Have permissions, do the thing!
        Toast.makeText(this, "TODO: Location and Contacts things", Toast.LENGTH_LONG).show();
    } else {
        // Ask for both permissions
        EasyPermissions.requestPermissions(this, getString(R.string.rationale_location_contacts),
                RC_LOCATION_CONTACTS_PERM, perms);
    }
}

শুভ কোডিং :)


1
@ ফারহান আমি বুঝতে পেরেছিলাম :) আমি কেবল এই ইচ্ছা করি যে অ্যান্ড্রয়েডের এপিআই সহজতর হয় যাতে আমাদের মোড়ক ব্যবহার করতে না হয়।
younes0

"আরসি_সিএএমএআরএএ_এলঙ্কেশন" কোথা থেকে এসেছে তা আমি দেখতে পাচ্ছি না বা এর পরিবর্তে অন্যান্য অনুমতিগুলি কোথায় পাব, আপনি কি জানেন যে কোথা থেকে এসেছে?
ফোনিক্স

17

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

  • android.permission_group.CALENDAR

    • android.permission.READ_CALENDAR
    • android.permission.WRITE_CALENDAR
  • android.permission_group.CAMERA

    • android.permission.CAMERA
  • android.permission_group.CONTACTS

    • android.permission.READ_CONTACTS
    • android.permission.WRITE_CONTACTS
    • android.permission.GET_ACCOUNTS
  • android.permission_group.LOCATION

    • android.permission.ACCESS_FINE_LOCATION
    • android.permission.ACCESS_COARSE_LOCATION
  • android.permission_group.MICROPHONE

    • android.permission.RECORD_AUDIO
  • android.permission_group.PHONE

    • android.permission.READ_PHONE_STATE
    • android.permission.CALL_PHONE
    • android.permission.READ_CALL_LOG
    • android.permission.WRITE_CALL_LOG
    • android.permission.ADD_VOICEMAIL
    • android.permission.USE_SIP
    • android.permission.PROCESS_OUTGOING_CALLS
  • android.permission_group.SENSORS

    • android.permission.BODY_SENSORS
  • android.permission_group.SMS

    • android.permission.SEND_SMS
    • android.permission.RECEIVE_SMS
    • android.permission.READ_SMS
    • android.permission.RECEIVE_WAP_PUSH
    • android.permission.RECEIVE_MMS
    • android.permission.READ_CELL_BROADCASTS
  • android.permission_group.STORAGE

    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

অনুমতিগুলি পরীক্ষা করার জন্য এখানে নমুনা কোডটি রয়েছে:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.WRITE_CALENDAR)) {
        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
        alertBuilder.setCancelable(true);
        alertBuilder.setMessage("Write calendar permission is necessary to write event!!!");
        alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            public void onClick(DialogInterface dialog, int which) {
                ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.WRITE_CALENDAR}, MY_PERMISSIONS_REQUEST_WRITE_CALENDAR);
            }
        });
    } else {
        ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.WRITE_CALENDAR}, MY_PERMISSIONS_REQUEST_WRITE_CALENDAR);
    }
}

14

আমার ক্লাসে রানটাইম অনুমতি Activityবা অনুরোধের জন্যFragment

এটি ব্যবহারকারীর অনুমতি ((সাথে / ছাড়া ) বিকল্প সহজতর করার পরে অনুমতি অনুমোদনের জন্য যুক্তি প্রদর্শন বা সেটিং খুলতে আপনাকে সহায়তা করে helpNever ask again

class RequestPermissionHandler(private val activity: Activity? = null,
                               private val fragment: Fragment? = null,
                               private val permissions: Set<String> = hashSetOf(),
                               private val listener: Listener? = null
) {
    private var hadShowRationale: Boolean = false

    fun requestPermission() {
        hadShowRationale = showRationaleIfNeed()
        if (!hadShowRationale) {
            doRequestPermission(permissions)
        }
    }

    fun retryRequestDeniedPermission() {
        doRequestPermission(permissions)
    }

    private fun showRationaleIfNeed(): Boolean {
        val unGrantedPermissions = getPermission(permissions, Status.UN_GRANTED)
        val permanentDeniedPermissions = getPermission(unGrantedPermissions, Status.PERMANENT_DENIED)
        if (permanentDeniedPermissions.isNotEmpty()) {
            val consume = listener?.onShowSettingRationale(unGrantedPermissions)
            if (consume != null && consume) {
                return true
            }
        }

        val temporaryDeniedPermissions = getPermission(unGrantedPermissions, Status.TEMPORARY_DENIED)
        if (temporaryDeniedPermissions.isNotEmpty()) {
            val consume = listener?.onShowPermissionRationale(temporaryDeniedPermissions)
            if (consume != null && consume) {
                return true
            }
        }
        return false
    }

    fun requestPermissionInSetting() {
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        val packageName = activity?.packageName ?: run {
            fragment?.requireActivity()?.packageName
        }
        val uri = Uri.fromParts("package", packageName, null)
        intent.data = uri
        activity?.apply {
            startActivityForResult(intent, REQUEST_CODE)
        } ?: run {
            fragment?.startActivityForResult(intent, REQUEST_CODE)
        }
    }

    fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
                                   grantResults: IntArray) {
        if (requestCode == REQUEST_CODE) {
            for (i in grantResults.indices) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    markNeverAskAgainPermission(permissions[i], false)
                } else if (!shouldShowRequestPermissionRationale(permissions[i])) {
                    markNeverAskAgainPermission(permissions[i], true)
                }
            }
            var hasShowRationale = false
            if (!hadShowRationale) {
                hasShowRationale = showRationaleIfNeed()
            }
            if (hadShowRationale || !hasShowRationale) {
                notifyComplete()
            }
        }
    }

    fun onActivityResult(requestCode: Int) {
        if (requestCode == REQUEST_CODE) {
            getPermission(permissions, Status.GRANTED).forEach {
                markNeverAskAgainPermission(it, false)
            }
            notifyComplete()
        }
    }

    fun cancel() {
        notifyComplete()
    }

    private fun doRequestPermission(permissions: Set<String>) {
        activity?.let {
            ActivityCompat.requestPermissions(it, permissions.toTypedArray(), REQUEST_CODE)
        } ?: run {
            fragment?.requestPermissions(permissions.toTypedArray(), REQUEST_CODE)
        }
    }

    private fun getPermission(permissions: Set<String>, status: Status): Set<String> {
        val targetPermissions = HashSet<String>()
        for (p in permissions) {
            when (status) {
                Status.GRANTED -> {
                    if (isPermissionGranted(p)) {
                        targetPermissions.add(p)
                    }
                }
                Status.TEMPORARY_DENIED -> {
                    if (shouldShowRequestPermissionRationale(p)) {
                        targetPermissions.add(p)
                    }
                }
                Status.PERMANENT_DENIED -> {
                    if (isNeverAskAgainPermission(p)) {
                        targetPermissions.add(p)
                    }
                }
                Status.UN_GRANTED -> {
                    if (!isPermissionGranted(p)) {
                        targetPermissions.add(p)
                    }
                }
            }
        }
        return targetPermissions
    }

    private fun isPermissionGranted(permission: String): Boolean {
        return activity?.let {
            ActivityCompat.checkSelfPermission(it, permission) == PackageManager.PERMISSION_GRANTED
        } ?: run {
            ActivityCompat.checkSelfPermission(fragment!!.requireActivity(), permission) == PackageManager.PERMISSION_GRANTED
        }
    }

    private fun shouldShowRequestPermissionRationale(permission: String): Boolean {
        return activity?.let {
            ActivityCompat.shouldShowRequestPermissionRationale(it, permission)
        } ?: run {
            ActivityCompat.shouldShowRequestPermissionRationale(fragment!!.requireActivity(), permission)
        }
    }

    private fun notifyComplete() {
        listener?.onComplete(getPermission(permissions, Status.GRANTED), getPermission(permissions, Status.UN_GRANTED))
    }

    private fun getPrefs(context: Context): SharedPreferences {
        return context.getSharedPreferences("SHARED_PREFS_RUNTIME_PERMISSION", Context.MODE_PRIVATE)
    }

    private fun isNeverAskAgainPermission(permission: String): Boolean {
        return getPrefs(requireContext()).getBoolean(permission, false)
    }

    private fun markNeverAskAgainPermission(permission: String, value: Boolean) {
        getPrefs(requireContext()).edit().putBoolean(permission, value).apply()
    }

    private fun requireContext(): Context {
        return fragment?.requireContext() ?: run {
            activity!!
        }
    }

    enum class Status {
        GRANTED, UN_GRANTED, TEMPORARY_DENIED, PERMANENT_DENIED
    }

    interface Listener {
        fun onComplete(grantedPermissions: Set<String>, deniedPermissions: Set<String>)
        fun onShowPermissionRationale(permissions: Set<String>): Boolean
        fun onShowSettingRationale(permissions: Set<String>): Boolean
    }

    companion object {
        const val REQUEST_CODE = 200
    }
}

Activityমত ব্যবহার করা

class MainActivity : AppCompatActivity() {
    private lateinit var smsAndStoragePermissionHandler: RequestPermissionHandler

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        smsAndStoragePermissionHandler = RequestPermissionHandler(this@MainActivity,
                permissions = setOf(Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_EXTERNAL_STORAGE),
                listener = object : RequestPermissionHandler.Listener {
                    override fun onComplete(grantedPermissions: Set<String>, deniedPermissions: Set<String>) {
                        Toast.makeText(this@MainActivity, "complete", Toast.LENGTH_SHORT).show()
                        text_granted.text = "Granted: " + grantedPermissions.toString()
                        text_denied.text = "Denied: " + deniedPermissions.toString()
                    }

                    override fun onShowPermissionRationale(permissions: Set<String>): Boolean {
                        AlertDialog.Builder(this@MainActivity).setMessage("To able to Send Photo, we need SMS and" + " Storage permission")
                                .setPositiveButton("OK") { _, _ ->
                                    smsAndStoragePermissionHandler.retryRequestDeniedPermission()
                                }
                                .setNegativeButton("Cancel") { dialog, _ ->
                                    smsAndStoragePermissionHandler.cancel()
                                    dialog.dismiss()
                                }
                                .show()
                        return true // don't want to show any rationale, just return false here
                    }

                    override fun onShowSettingRationale(permissions: Set<String>): Boolean {
                        AlertDialog.Builder(this@MainActivity).setMessage("Go Settings -> Permission. " + "Make SMS on and Storage on")
                                .setPositiveButton("Settings") { _, _ ->
                                    smsAndStoragePermissionHandler.requestPermissionInSetting()
                                }
                                .setNegativeButton("Cancel") { dialog, _ ->
                                    smsAndStoragePermissionHandler.cancel()
                                    dialog.cancel()
                                }
                                .show()
                        return true
                    }
                })

        button_request.setOnClickListener { handleRequestPermission() }
    }

    private fun handleRequestPermission() {
        smsAndStoragePermissionHandler.requestPermission()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
                                            grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        smsAndStoragePermissionHandler.onRequestPermissionsResult(requestCode, permissions,
                grantResults)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        smsAndStoragePermissionHandler.onActivityResult(requestCode)
    }
}

গিথুবে কোড

ডেমো


3
অনুমতি পেতে জিজ্ঞাসা করার সর্বোত্তম সমাধান যা আমি খুঁজে পেতে পারি
ডলডর্মমা

@ ফান, আপনার কাছে কি কোনও কোড স্নিপেট রয়েছে
যাঁর

10

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

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

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

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

               } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

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

অনুমতি সেরা অভ্যাস।

আপনি এখানে সরকারী নমুনা অ্যাপ্লিকেশন মাধ্যমে যেতে পারেন ।


দয়া করে মনে রাখবেন কলব্যাক পাওয়ার জন্য আমাদের অবশ্যই নোহিসটরি = ভুয়া থাকতে হবে। এছাড়াও পড়ুন এই ক্ষেত্রে আপনি কলব্যাক প্রাপ্ত করে না। আমি এটি বের করতে ঘন্টা নষ্ট করেছি।
অতুল

6

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

আমি নিম্নলিখিত পদ্ধতিতে অর্জন করেছি:

public class MarshMallowPermission {

    public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_GALLERY = 0;
    public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_CAMERA = 1;
    public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_LOAD_PROFILE = 2;
    public static final int CAMERA_PERMISSION_REQUEST_CODE = 3;
    public static final int LOCATION_PERMISSION_REQUEST_CODE = 4;
    Activity activity;
    Context mContext;

    public MarshMallowPermission(Activity activity) {
        this.activity = activity;
        this.mContext = activity;
    }

    public boolean checkPermissionForExternalStorage(){
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }

    public boolean checkPermissionForCamera(){
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }

    public boolean checkLocationPermission(){

        int result = ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }

    public void requestPermissionForExternalStorage(int requestCode){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            Toast.makeText(mContext.getApplicationContext(), "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},requestCode);
        }
    }

    public void requestPermissionForCamera(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
            Toast.makeText(mContext.getApplicationContext(), "Camera permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);
        }
    }
    public void requestPermissionForLocation(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION) && ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_COARSE_LOCATION)){
            Toast.makeText(mContext.getApplicationContext(), "Location permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
        }
    }
}

আপনার ক্রিয়াকলাপ শ্রেণিতে:

 public class MainActivity extends AppCompatActivity{

   private MarshMallowPermission marshMallowPermission;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("NavHome", "Oncreate_nav");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        marshMallowPermission = new MarshMallowPermission(MainActivity.this);



        if (!marshMallowPermission.checkPermissionForExternalStorage()) {
            marshMallowPermission.requestPermissionForExternalStorage(MarshMallowPermission.EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_LOAD_PROFILE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case MarshMallowPermission.EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE_BY_LOAD_PROFILE:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    //permission granted successfully

                } else {

                 //permission denied

                }
                break;
    }
    }

}

5

AndroidManLive.xML এ অনুমতিগুলি যুক্ত করুন

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

অ্যান্ড্রয়েড সংস্করণটি পরীক্ষা করার জন্য যদি এটি রানটাইমের অনুমতি প্রয়োজন কিনা।

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
    askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, 1);
}

অনুমোদিত না হলে ব্যবহারকারীকে অনুমতিটি দিতে বলুন।

private void askForPermission(String permission, int requestCode) {
    if (ContextCompat.checkSelfPermission(c, permission)
            != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
            Toast.makeText(c, "Please grant the requested permission to get your task done!", Toast.LENGTH_LONG).show();
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
        } else {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
        }
    }
}

অনুমতি পেলে বা না দেওয়া থাকলে কিছু করুন।

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //permission with request code 1 granted
                Toast.makeText(this, "Permission Granted" , Toast.LENGTH_LONG).show();
            } else {
                //permission with request code 1 was not granted
                Toast.makeText(this, "Permission was not Granted" , Toast.LENGTH_LONG).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

4

আমি এটি বেস ফ্রেগমেন্ট ক্লাস হিসাবে ব্যবহার করছি। আমি কেবলমাত্র একটি খণ্ডের কাছ থেকে অনুমতি চাইছি, তবে আপনি এটিকে রিফ্যাক্টর করতে পারেন এবং অনুরূপ ক্রিয়াকলাপের সংস্করণ তৈরি করতে পারেন।

public class BaseFragment extends Fragment {

    private static final int PERMISSION_REQUEST_BLOCK_INTERNAL = 555;
    private static final String PERMISSION_SHARED_PREFERENCES = "permissions";

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_BLOCK_INTERNAL) {
            boolean allPermissionsGranted = true;

            for (int iGranting : grantResults) {
                if (iGranting != PermissionChecker.PERMISSION_GRANTED) {
                    allPermissionsGranted = false;
                    break;
                }
            }

            if (allPermissionsGranted && permissionBlock != null) {
                permissionBlock.run();
            }

            permissionBlock = null;
        }
    }

    public void runNowOrAskForPermissionsFirst(String permission, Runnable block) {
        if (hasPermission(permission)) {
            block.run();
        } else if (!hasPermissionOrWillAsk(permission)) {
            permissionBlock = block;
            askForPermission(permission, PERMISSION_REQUEST_BLOCK_INTERNAL);
        }
    }

    public boolean hasPermissionOrWillAsk(String permission) {
        boolean hasPermission = hasPermission(permission);
        boolean hasAsked = hasPreviouslyAskedForPermission(permission);
        boolean shouldExplain = shouldShowRequestPermissionRationale(permission);

        return hasPermission || (hasAsked && !shouldExplain);
    }

    private boolean hasPermission(String permission) {
        return (ContextCompat.checkSelfPermission(getContext(), permission) == PackageManager.PERMISSION_GRANTED);
    }

    private boolean hasPreviouslyAskedForPermission(String permission) {
        SharedPreferences prefs = getContext().getSharedPreferences(PERMISSION_SHARED_PREFERENCES, Context.MODE_PRIVATE);
        return prefs.getBoolean(permission, false);
    }

    private void askForPermission(String permission, int requestCode) {
        SharedPreferences.Editor editor = getContext().getSharedPreferences(PERMISSION_SHARED_PREFERENCES, Context.MODE_PRIVATE).edit();

        editor.putBoolean(permission, true);
        editor.apply();

        requestPermissions(new String[] { permission }, requestCode);
    }
}

আপনার দুটি কার্যকর পদ্ধতি ব্যবহার করা উচিত:

  • #PermissionOrWillAsk - এটির জন্য অনুমতি ব্যবহার করা হয়েছে কিনা এবং আবার জিজ্ঞাসা করতে চায় না এমন কোনও ব্যবহারকারী অস্বীকার করে কিনা তা দেখতে এটি ব্যবহার করুন। ব্যবহারকারী কোনও বৈশিষ্ট্য না চাওয়ার বিষয়ে চূড়ান্ত উত্তর দিলে এটি ইউআই অক্ষম করার জন্য দরকারী।

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

এখানে একটি উদাহরণ:

mFragment.runNowOrAskForPermissionsFirst(Manifest.permission.ACCESS_FINE_LOCATION, new Runnable() {
    @Override
    public void run() {
        ...do something if we have permission...
    }
});

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


4

এটি একটি পরিষ্কার উপায় হতে পারে। ভালো লাগার মতো অ্যারেতে আপনার সমস্ত অনুমতি যুক্ত করুন

private static final String[] INITIAL_PERMS={
            android.Manifest.permission.ACCESS_FINE_LOCATION,
            android.Manifest.permission.ACCESS_COARSE_LOCATION
    };
    private static final int INITIAL_REQUEST=1337;

আপনার অনুমতি যাই হোক না কেন প্রতিটি অনুমতি জন্য পদ্ধতি তৈরি

@RequiresApi(api = Build.VERSION_CODES.M)
private boolean canAccessFineLocation() {
    return(hasPermission(Manifest.permission.ACCESS_FINE_LOCATION));
}

@RequiresApi(api = Build.VERSION_CODES.M)
private boolean canAccessCoarseLocation() {
    return(hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION));
}

@RequiresApi(api = Build.VERSION_CODES.M)
private boolean hasPermission(String perm) {
    return(PackageManager.PERMISSION_GRANTED == checkSelfPermission(perm));
}

এই পদ্ধতিটিকে অনক্রিয়েটে কল করুন

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
      if(!canAccessCoarseLocation() || !canAccessFineLocation()){
            requestPermissions(INITIAL_PERMS, INITIAL_REQUEST);
        }
 }

এখনআরউইকপিস্টেরেশনসাল্টে ওভাররাইড করুন

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if(requestCode == INITIAL_REQUEST){
        if (canAccessFineLocation() && canAccessCoarseLocation())  {
            //call your method
        }
        else {
            //show Toast or alert that this permissions is neccessary
        }
    }
}

1
কোনও প্রয়োজন ছিল না এবং আমার ক্রিয়াকলাপে আমি ত্রুটি পেয়েছি আমি ট্র্যাজেটএপি টীকাটি ব্যবহার করি
নাভিদ_পিডিপি 11

@ জাওয়াদ, আপনি যদি কিছু অস্বীকৃত অনুমতি কলব্যাক যোগ করেন তবে এটি কার্যকর হবে
বেনরেবিন

3

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

final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

    private void insertDummyContactWrapper() {
        List<String> permissionsNeeded = new ArrayList<String>();

        final List<String> permissionsList = new ArrayList<String>();
        if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION))
            permissionsNeeded.add("GPS");
        if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
            permissionsNeeded.add("Read Contacts");
        if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
            permissionsNeeded.add("Write Contacts");

        if (permissionsList.size() > 0) {
            if (permissionsNeeded.size() > 0) {
                // Need Rationale
                String message = "You need to grant access to " + permissionsNeeded.get(0);
                for (int i = 1; i < permissionsNeeded.size(); i++)
                    message = message + ", " + permissionsNeeded.get(i);
                showMessageOKCancel(message,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                            }
                        });
                return;
            }
            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            return;
        }

        insertDummyContact();
    }

    private boolean addPermission(List<String> permissionsList, String permission) {
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            // Check for Rationale Option
            if (!shouldShowRequestPermissionRationale(permission))
                return false;
        }
        return true;
    }






@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
                {
                Map<String, Integer> perms = new HashMap<String, Integer>();
                // Initial
                perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);
                // Fill with results
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);
                // Check for ACCESS_FINE_LOCATION
                if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
                    // All Permissions Granted
                    insertDummyContact();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

আরো বিস্তারিত জানার জন্য. বেলো লিঙ্কটি পরীক্ষা করুন

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en


setSdkVersion বেলো 22 কাজ করবে, তবে অ্যান্ড্রয়েড এম ব্যবহারকারীর ক্ষেত্রে সেটিংস থেকে কোনও অনুমতি অস্বীকার করার ক্ষেত্রে কী হবে?
নীলাবজা

হ্যাঁ .. আপনি ঠিক বলেছেন এবার অ্যাপস ক্রাশ হবে be যাতে, সেই সময় আপনাকে আবার ব্যবহারকারীর কাছ থেকে অনুমতি অস্বীকার করে বা না তা পরীক্ষা করা দরকার .. আমি এটি পরীক্ষা করি না তবে আমার ইচ্ছা এটি কাজ করবে will ব্যবহারকারীর কাছ থেকে প্রতিটি ক্রিয়া গঠন করুন অনুমতি দেওয়া হয়েছে কিনা তা যাচাই করা ভাল।
তারিকুল

3

রানটাইম অনুমতি হ্যান্ডল করতে গুগল একটি লাইব্রেরি প্রকল্প সরবরাহ করেছে। আপনি এখান থেকে https://github.com/googlesferences/easypermission চেক করতে পারেন

আপনার বিল্ড.gradle ফাইলটিতে নিম্নলিখিত নির্ভরতা যুক্ত করে EasyPerifications ইনস্টল করা আছে:

dependencies {
compile 'pub.devrel:easypermissions:0.3.0'
}

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

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {

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

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    // Forward results to EasyPermissions
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}

@Override
public void onPermissionsGranted(int requestCode, List<String> list) {
    // Some permissions have been granted
    // ...
}

@Override
public void onPermissionsDenied(int requestCode, List<String> list) {
    // Some permissions have been denied
    // ...
}
}

এই লাইব্রেরিটি কীভাবে https://github.com/milon87/EasyPermission কাজ করে তা আপনি এখানে একটি কার্যকারী উদাহরণ পাবেন


2

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

এটি জীবনকে সহজতর করার সাথে সাথে ব্যবহার করে দেখুন: অ্যান্ড্রয়েড অনুমতি


2

নীচের এই কোডটি নিখুঁতভাবে কাজ করে I আমি একটি উদাহরণের সাহায্যে ব্যাখ্যা করছি।

আমার ক্ষেত্রে আমি পৃথকভাবে ব্যবহারের ক্লাসে অনুমতি যাচাই করেছিলাম এবং উপযুক্ত ক্লাসগুলি থেকে আমার যাচাই করা দরকার passed

নীচের কোড অংশটি ফাংশন কলটি দেখায় this এক্ষেত্রে android.Manifest.permission.READ_EXTERNAL_STORAGEঅনুমতির জন্য আবেদন করছি ।

//the below call is from a fragment
     @OnClick(R.id.button)//butterknife implementation
        public void attachPressed() {
            if (PermissionUtils.hasThisPermission(getContext(), android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
                onAttachPressed();
            } else {
                PermissionUtils.isPermissionRequestNeeded(getActivity(), this, android.Manifest.permission.READ_EXTERNAL_STORAGE, PermissionUtils.REQUEST_GROUP_STORAGE);
            }
        }   

উপরের ক্ষেত্রে যদি অনুমতি দেওয়া হয় তবে এটির অনুমতি দেওয়া হয় যদি onAttachPressed();ফাংশনটি বলা হয় অন্যথায় আমরা অনুরোধের অনুমতি চেক করি।

নীচে আমার ক্ষেত্রে ব্যবহারের ক্লাসে উপস্থিত কোড রয়েছে PermissionUtils

public final class PermissionUtils {

    public static final int REQUEST_GROUP_STORAGE = 1508;

    private PermissionUtils() {
    }

    public static boolean hasThisPermission(Context context, String permission) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
        } else {
            return true;
        }
    }

    public static boolean isPermissionRequestNeeded(Activity activity, Fragment fragment, String permission, int requestCode) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !hasThisPermission(activity, permission)) {
            final String[] permissions = new String[]{permission};
            if (fragment == null) {
                activity.requestPermissions(permissions, requestCode);
            } else {
                fragment.requestPermissions(permissions, requestCode);
            }
            return true;
        }
        return false;
    }
}

অনুরোধের পরে আপনি যদি ফাংশনটি কল করতে চান onRequestPermissionsResultবা অন্যথায় আপনাকে ফাংশন কলের জন্য আবার বোতাম টিপতে হবে।

সুতরাং এটি থেকে কল onRequestPermissionsResult

//the below call  is from a fragment
     @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            if (requestCode == PermissionUtils.REQUEST_GROUP_STORAGE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                onAttachPressed();
            } else {
                Log.e("value", "Permission Denied, You cannot use local drive .");
            }
        }

2

অনুমতি চাইতে আমি RxPermission লাইব্রেরি লাইব্রেরি ব্যবহার করি । কারণ এটি দীর্ঘ কোড যা অনুমতির জন্য আমাদের লিখতে হবে।

RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity instance // Must be done during an initialization phase like onCreate
rxPermissions
    .request(Manifest.permission.CAMERA)
    .subscribe(granted -> {
        if (granted) { // Always true pre-M
           // I can control the camera now
        } else {
           // Oups permission denied
        }
    });

আপনার মধ্যে এই নির্ভরতা যুক্ত করুন build.gradle

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

dependencies {
    implementation 'com.github.tbruyelle:rxpermissions:0.10.1'
    implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
}

1

এটা চেষ্টা কর

মার্শমেলো সংস্করণে অনুমতি চাওয়ার এটি সহজতম উপায়।

 if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED&&ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
    {
        //TO do here if permission is granted by user
    }
    else
    {
        //ask for permission if user didnot given
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.ACCESS_FINE_LOCATION}, 0);
        }
    }

দ্রষ্টব্য: - ম্যানিফেস্ট ফাইলেও এই একই অনুমতিটি যুক্ত করতে ভুলবেন না

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

অনুমতি পরীক্ষা করার জন্য দ্বিতীয় পদ্ধতি কোড অনুমোদিত হয় নাকি?

ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA}, 1);

এবং পদ্ধতিটি ওভাররাইড করুন

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
         //                    grantResult[0] means it will check for the first postion permission which is READ_EXTERNAL_STORAGE
        //                    grantResult[1] means it will check for the Second postion permission which is CAMERA
                Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
            }
            else
                Toast.makeText(this, "Permission not Granted", Toast.LENGTH_SHORT).show();
            return;
        }
    }
}

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

@ নীলাবজা ম্যানিফেস্টে অনুমতি ঘোষণা সমস্ত অ্যান্ড্রয়েড সংস্করণ আবহাওয়ার জন্য মার্শমালো বা না আবশ্যক
সুনীল

1

প্রচুর কোড লেখা এড়িয়ে অনুমতি চাওয়ার সহজ উপায়,

https://github.com/sachinvarma/EasyPermission

কীভাবে যুক্ত করবেন:

repositories {
        maven { url "https://jitpack.io" }
    }

implementation 'com.github.sachinvarma:EasyPermission:1.0.1'

কিভাবে অনুমতি চাইতে হবে:

 List<String> permission = new ArrayList<>();
 permission.add(EasyPermissionList.READ_EXTERNAL_STORAGE);
 permission.add(EasyPermissionList.ACCESS_FINE_LOCATION);

 new EasyPermissionInit(MainActivity.this, permission);

এটি আশা করা কারও পক্ষে সহায়ক হবে।


1

আমি সমস্ত উত্তরের মধ্যে দিয়েছি, তবে আমার সঠিক উত্তরটি সন্তুষ্ট করতে পারি না, সুতরাং আমি এখানে লিখেছি এবং নিখুঁতভাবে কাজ করে এমন একটি উদাহরণ এখানেও ব্যবহারকারী আবার জিজ্ঞাসা করবেন না চেকবক্সটি ক্লিক করে ।

  1. এমন একটি পদ্ধতি তৈরি করুন যা কল করার সময় ডাকা হবে যখন আপনি রানটাইম অনুমতি চাইবেন readContacts()বা openCamera()নীচের মত আপনিও পেতে পারেন :

    private void readContacts() {
        if (!askContactsPermission()) {
            return;
        } else {
            queryContacts();
        } }

এখন আমাদের তৈরি করা দরকার askContactsPermission(), আপনি এটির নাম askCameraPermission()বা আপনি যেই অনুমতি চাইবেন তা নামও রাখতে পারেন।

    private boolean askContactsPermission() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }
    if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
        return true;
    }
    if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
        Snackbar.make(parentLayout, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                .setAction(android.R.string.ok, new View.OnClickListener() {
                    @Override
                    @TargetApi(Build.VERSION_CODES.M)
                    public void onClick(View v) {
                        requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                    }
                }).show();
    } else if (contactPermissionNotGiven) {
        openPermissionSettingDialog();
    } else {
        requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
        contactPermissionNotGiven = true;

    }
    return false;
}

এই ফাংশনটি লেখার আগে নিশ্চিত হয়ে নিন যে আপনি নীচের উদাহরণটি ভেরিয়েবলকে প্রদর্শিত হিসাবে সংজ্ঞায়িত করেছেন:

    private View parentLayout;
    private boolean contactPermissionNotGiven;;


/**
 * Id to identity READ_CONTACTS permission request.
 */
private static final int REQUEST_READ_CONTACTS = 0;

onRequestPermissionsResultনীচে প্রদর্শিত হিসাবে পদ্ধতিটি ওভাররাইড করার এখন চূড়ান্ত পদক্ষেপ :

/**
 * Callback received when a permissions request has been completed.
 */
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode == REQUEST_READ_CONTACTS) {
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            queryContacts();
        }
    }
}

এখানে আমরা রানটাইম অনুমতি নিয়ে সম্পন্ন করেছি, অ্যাডন হ'ল openPermissionSettingDialog()ব্যবহারকারী যদি আবার জিজ্ঞাসা করবেন না চেকবক্সটি ক্লিক করে স্থায়ীভাবে অনুমতিটি অক্ষম করে ফেলেছে তবে সেটিংস স্ক্রিনটি কেবল খুলবে । নীচে পদ্ধতিটি:

    private void openPermissionSettingDialog() {
    String message = getString(R.string.message_permission_disabled);
    AlertDialog alertDialog =
            new AlertDialog.Builder(MainActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
                    .setMessage(message)
                    .setPositiveButton(getString(android.R.string.ok),
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Intent intent = new Intent();
                                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                                    intent.setData(uri);
                                    startActivity(intent);
                                    dialog.cancel();
                                }
                            }).show();
    alertDialog.setCanceledOnTouchOutside(true);
}

আমরা কী মিস করেছি? 1. ব্যবহৃত স্ট্রিংগুলি সংজ্ঞায়িত করা হচ্ছেstrings.xml

<string name="permission_rationale">"Contacts permissions are needed to display Contacts."</string>
    <string name="message_permission_disabled">You have disabled the permissions permanently,
        To enable the permissions please go to Settings -> Permissions and enable the required Permissions,
        pressing OK you will be navigated to Settings screen</string>

  1. parentLayoutভেরিয়েবলের ভিতরে onCreateপদ্ধতিটি শুরু করা izing

    প্যারেন্টলয়আউট = সন্ধান ভিউআইআইডি (আর.আইডি.কম);

  2. ভিতরে প্রয়োজনীয় অনুমতি সংজ্ঞায়িত করা হচ্ছে AndroidManifest.xml

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

  1. queryContactsপদ্ধতি, আপনার প্রয়োজন বা রানটাইম অনুমতি আপনি আপনার পদ্ধতি যা আগে কল করতে পারেন উপর ভিত্তি করে permissionপ্রয়োজন পড়তো। আমার ক্ষেত্রে আমি কেবল নীচের মত যোগাযোগটি আনতে লোডারটি ব্যবহার করি:

    private void queryContacts() {
    getLoaderManager().initLoader(0, null, this);}

এটি দুর্দান্ত খুশি কোডিংয়ের কাজ করে :)


1

যদি আপনি অ্যান্ড্রয়েডএক্স ক্রিয়াকলাপ 1.2.0 বা অ্যান্ড্রয়েডএক্স টুকরা 1.3.0 ব্যবহার করেন :

এখানে নতুন ক্রিয়াকলাপের ফলাফলের এপিআই রয়েছে যা আপনি অনুমতি চাইতে জিজ্ঞাসা করতে পারেন:

val launcher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
    if (isGranted) {
        // Permission granted. Do the tasks.
    }
}
launcher.launch(Manifest.permission.ACCESS_FINE_LOCATION)

0
  if (CommonMethod.isNetworkAvailable(MainActivity.this)) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this,
                                android.Manifest.permission.CAMERA);
                        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
                            //showing dialog to select image
                            callFacebook();
                            Log.e("permission", "granted MarshMallow");
                        } else {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE,
                                            android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA}, 1);
                        }
                    } else {
                        Log.e("permission", "Not Required Less than MarshMallow Version");
                        callFacebook();
                    }
                } else {
                    CommonMethod.showAlert("Internet Connectivity Failure", MainActivity.this);
                }

0

আপনি আমার গ্রন্থাগারটি ব্যবহার করতে পারেন - NoPermission (এটি কেবলমাত্র এক শ্রেণি)

compile 'ru.alexbykov:nopermission:1.1.1'

নমুনা

PermissionHelper permissionHelper = new PermissionHelper(this); //don't use getActivity in fragment!

permissionHelper.check(Manifest.permission.READ_CONTACTS)
                .onSuccess(this::onSuccess)
                .onDenied(this::onDenied)
                .onNeverAskAgain(this::onNeverAskAgain)
                .run();

onRequestPermissionResult:

 @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
        permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
   }

আমি মনে করি এপিআই EasyPermissionsগুগলের চেয়ে বেশি সুবিধাজনক ।


0

রানটাইম অনুমতি যে কোনও জায়গায় প্রয়োগের উদাহরণ এখানে দেওয়া আছে

use dependency
maven { url 'https://jitpack.io' }
dependencies {
implementation 'com.github.irshadsparky:PermissionLib:master-SNAPSHOT'
}

এবং এই মত কল কোড:

PermissionHelper.requestCamera(new PermissionHelper.OnPermissionGrantedListener() {
@Override
public void onPermissionGranted() {

}
});

আপনি আরও গিথুব পেতে পারেন


0

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


0

অ্যান্ড্রয়েডে রন্টটাইম পার্মিশন

public void onClick(View view) {
    if (view.getId() == shareButton.getId()) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            this.shareLog();
        } else {
            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, LogConstants.PERMISSION_REQ_WRITE_EXTERNAL_STORAGE);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == LogConstants.PERMISSION_REQ_WRITE_EXTERNAL_STORAGE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            this.shareLog();
        }
    }
}

অনক্লিক পদ্ধতিটি রানটাইমের অনুমতি পরীক্ষা করা

এবং যদি অনুমতিটি সীমাবদ্ধ থাকে তবে তা অনুমতির জন্য অনুরোধ করে

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