WRITE_SETTINGS অনুমতি পাওয়া যায় না


85

অ্যান্ড্রয়েড এম প্রিভিউ 3 এ যখন আমার 23 টির একটি লক্ষ্যযুক্ত এপিআই থাকে তখন আমি ম্যানিফেস্ট.প্রেমিশন.ডাব্লুআইআরআইটিএসএসটিটিটিংসের অনুমতি অর্জন করতে পারি না।

 requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS},
              101);

অনুরোধের অনুমতিটি আমার ডায়লগটি নিয়ে আসে না, তবে আমি যদি এই অনুমতি ব্যতীত নিম্নলিখিত কলটি করি,

 RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri);

আমার অনুমতি নেই বলে কলটি কল করবে।

আমি জানি না এখান থেকে কোথায় যাব। 23 এর জন্য কি নতুন রিংটোন এপিআই রয়েছে? অথবা এই অনুমতি পরিবর্তন করা কি কোনও সিস্টেম-সিস্টেমের পক্ষে রিংটোন পরিবর্তন করা অসম্ভব করে দিয়েছে?

উত্তর:


134

WRITE_SETTINGSদস্তাবেজের উপর ভিত্তি করে ব্যবহার করতে :

  1. আছে <uses-permission>স্বাভাবিক হিসাবে ম্যানিফেস্টে উপাদান।

  2. Settings.System.canWrite()আপনি সেটিংস লেখার যোগ্য কিনা তা দেখার জন্য কল করুন

  3. যদি canWrite()ফিরে আসে false, ক্রিয়াকলাপটি শুরু করুনACTION_MANAGE_WRITE_SETTINGS যাতে ব্যবহারকারী আপনার অ্যাপ্লিকেশনটিকে সেটিংসে প্রকৃতপক্ষে লেখার অনুমতি দিতে সেখানে সম্মত হতে পারে।

অন্য কথায়, সেটিংসে লিখন এখন একটি ডাবল-অপ্ট-ইন (ডিভাইস অ্যাডমিন এপিআই, অ্যাক্সেসিবিলিটি পরিষেবা ইত্যাদির অনুরূপ) ইনস্টল করতে সম্মত হন, সেটিংসে পৃথকভাবে সম্মত হন)

এছাড়াও নোট করুন যে আমি এগুলি এখনও ব্যবহার করার চেষ্টা করি নি - এটি এমন গবেষণার ভিত্তিতে যা আমি গতকাল অ্যান্ড্রয়েড .0.০ পরিবর্তনে করেছি


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

এটি সত্যিই কাজ করেছে। তবে শেষ ব্যবহারকারীর পক্ষে এটি একটি খারাপ দৃষ্টিভঙ্গি। গুগলের কোনও আচরণ কি এই আচরণ পরিবর্তন করছে?
এফএইচএল

4
@ এফএইচএল: অ্যান্ড্রয়েড .0.০-তে dangerousঅন্য জিনিসের সাথে নিয়মিত রানটাইম অনুমতি পদ্ধতির পরিবর্তে তারা কেন এই রুটে চলেছিল তা আমি জানি না । এটি শিগগির যেকোন সময় পরিবর্তন হলে আমি অবাক হব।
কমন্সওয়্যার

4
আপনি আপনার অ্যাপ্লিকেশনটিকে এর intent.setData(Uri.parse("package:" + Context.getPackageName()));
মতোভাবে

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

45

কমন্সওয়্যারের উত্তর এবং ওগিক্সের মন্তব্য ছাড়াও এখানে কয়েকটি ডামি কোড দেওয়া হল:

private boolean checkSystemWritePermission() {
    boolean retVal = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        retVal = Settings.System.canWrite(this);
        Log.d(TAG, "Can Write Settings: " + retVal);
        if(retVal){
            Toast.makeText(this, "Write allowed :-)", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this, "Write not allowed :-(", Toast.LENGTH_LONG).show();
            FragmentManager fm = getFragmentManager();
            PopupWritePermission dialogFragment = new PopupWritePermission();
            dialogFragment.show(fm, getString(R.string.popup_writesettings_title));
        }
    }
    return retVal;
}

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

private void openAndroidPermissionsMenu() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
    startActivity(intent);
}

40

পূর্ববর্তী উত্তরগুলি দুর্দান্ত, অনুমতি চাওয়ার জন্য ফলাফল পাওয়ার জন্য আমার কাছে সামান্য সংযোজন রয়েছে।

 public static void youDesirePermissionCode(Activity context){
        boolean permission;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            permission = Settings.System.canWrite(context);
        } else {
            permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
        }
        if (permission) {
            //do your code
        }  else {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                context.startActivityForResult(intent, MainActivity.CODE_WRITE_SETTINGS_PERMISSION);
            } else {
                ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, MainActivity.CODE_WRITE_SETTINGS_PERMISSION);
            }
        }
    }

এবং তারপরে Activity:

@SuppressLint("NewApi")
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == MainActivity.CODE_WRITE_SETTINGS_PERMISSION && Settings.System.canWrite(this)){
            Log.d("TAG", "MainActivity.CODE_WRITE_SETTINGS_PERMISSION success");
            //do your code
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == MainActivity.CODE_WRITE_SETTINGS_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //do your code
        }
    }

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

4
ক্রিয়াকলাপম্পট.আরএকুয়েস্টপিরমেশনস (প্রসঙ্গ, নতুন স্ট্রিং [] {Manifest.permission.WRITE_SETTINGS}, ....); ব্যবহার করা যাবেনা. এটি একটি বিশেষ অনুমতি। ডকুমেন্টেশনে যেমন বলা হয়েছে তেমন উদ্দেশ্য নিয়ে আমরা কেবল এই অনুমতিটির জন্য অনুরোধ করতে পারি। এছাড়াও মার্শমেলো এর আগে ইনস্টল করার সময় অনুমতি দেওয়া হয়েছিল
বেনামে

4
@ ইশাহাক আপনার পরিবর্তনশীল MainActivity.CODE_WRITE_SETTINGS_PERMISSIONকী?
ব্রুনো বিয়েরি

@ ব্রুনোবেইরি হ্যাঁ আপনি ঠিক বলেছেন, আমি এটি বাদ দিয়েছি। আমি আমার উত্তরটি সম্পাদনা করব যাতে এটি ভারবস হয়।
যশাহাক

তাহলে কি MainActivity.CODE_WRITE_SETTINGS_PERMISSION?
বন্ধনী

13

এটি একটি সম্পূর্ণ উদাহরণ:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (Settings.System.canWrite(context) {
        // Do stuff here
    }
    else {
        Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
        intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

intent.setData (Uri.parse ("প্যাকেজ:" + getActivity ()। getPackageName ()));
ওলে কে

8

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

এবং সেটিংস লেখার জন্য লিখিতকরণ এখানে রয়েছে

ম্যানিফেস্ট অ্যাড

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

আপনার ক্লাসে

private boolean checkSystemWritePermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if(Settings.System.canWrite(context))
            return true;
        else 
            openAndroidPermissionsMenu();
    }
    return false;
}

private void openAndroidPermissionsMenu() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
        intent.setData(Uri.parse("package:" + context.getPackageName()));
        context.startActivity(intent);
    }
}

এবং এটি ব্যবহার করুন

try {
       if (checkSystemWritePermission()) {
            RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri);
            Toast.makeText(context, "Set as ringtoon successfully ", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(context, "Allow modify system settings ==> ON ", Toast.LENGTH_LONG).show();
            }
        } catch (Exception e) {
            Log.i("ringtoon",e.toString());
            Toast.makeText(context, "unable to set as Ringtoon ", Toast.LENGTH_SHORT).show();
        }

5

অনুমতিটি android.permission.WRITE_SETTINGSএখন গ্রুপে এবং signature|appop|pre23|preinstalledপছন্দ মতোandroid.permission.CHANGE_NETWORK_STATEandroid.permission.SYSTEM_ALERT_WINDOW

এর অর্থ আপনি এটি 22 ও নীচে এসডিকে পাবেন। নতুন সংস্করণে আপনাকে অ্যাপ অপারেটর হতে হবে।


4

আমি বেলো যেমন ব্যবহার করেছি ..

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        boolean retVal = true;
        retVal = Settings.System.canWrite(this);
        if (retVal == false) {
            if (!Settings.System.canWrite(getApplicationContext())) {

                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
                Toast.makeText(getApplicationContext(), "Please, allow system settings for automatic logout ", Toast.LENGTH_LONG).show();
                startActivityForResult(intent, 200);
            }
        }else {
            Toast.makeText(getApplicationContext(), "You are not allowed to wright ", Toast.LENGTH_LONG).show();
        }
    }

অনুমতি প্রকাশ

<uses-permission  android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />

2

AndroidManLive.xML এ অনুমতি নীচে উল্লেখ করুন

ক্রিয়াকলাপে সেটিং পরিবর্তন করার জন্য নীচে ব্যবহার করুন।

if(Settings.System.canWrite(this)){
    // change setting here
}
else{
    //Migrate to Setting write permission screen. 
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + mContext.getPackageName()));
    startActivity(intent);
}

এই অনুমতি ব্যবহার করুন। <ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.WRITE_SETTINGS" />
সৌরভ তেজরাজ

1

Kotlin Version in Simple Steps

এই পদক্ষেপগুলি অনুসরণ করুন:

1.manifest.xml সাধারণভাবে অনুমতি ব্যবহারের উপাদান যুক্ত করুন :

<uses-permission
    android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />

২. আপনি যেখানে সেটিংস পরিবর্তন করতে চান সেখানে লেখার অ্যাক্সেস চেক করুন:

if (context.canWriteSettings) {
    // change the settings here ...
} else {
    startManageWriteSettingsPermission()
}

3. অনুমতি অনুরোধ করার ক্ষেত্রে কোডের এই লাইনগুলি যুক্ত করুন:

private fun startManageWriteSettingsPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Intent(
            Settings.ACTION_MANAGE_WRITE_SETTINGS,
            Uri.parse("package:${context.packageName}")
        ).let {
            startActivityForResult(it, REQUEST_CODE_WRITE_SETTINGS_PERMISSION)
        }
    }
}

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

    when (requestCode) {
        REQUEST_CODE_WRITE_SETTINGS_PERMISSION -> {
            if (context.canWriteSettings) {
                // change the settings here ...
            } else {
                Toast.makeText(context, "Write settings permission is not granted!", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

val Context.canWriteSettings: Boolean
    get() = Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.System.canWrite(this)

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