অ্যান্ড্রয়েড ৪.১: কীভাবে বিজ্ঞপ্তিগুলি চেক করবেন অ্যাপ্লিকেশনটির জন্য অক্ষম?


98

Android 4.1 ব্যবহারকারীকে একটি নির্দিষ্ট অ্যাপ্লিকেশনের জন্য বিজ্ঞপ্তিগুলি অক্ষম করতে একটি চেক বাক্স সরবরাহ করে।

তবে, বিকাশকারী হিসাবে আমাদের জানার কোনও উপায় নেই যে বিজ্ঞপ্তি দেওয়ার কলটি কার্যকর ছিল কি না।

বর্তমান অ্যাপ্লিকেশনের জন্য বিজ্ঞপ্তিগুলি অক্ষম আছে কিনা তা আমার সত্যিই পরীক্ষা করা দরকার তবে আমি এপিআই-তে এর জন্য কোনও সেটিংস খুঁজে পাচ্ছি না।

কোডটিতে এই সেটিংটি চেক করার কোনও উপায় আছে কি?


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

আমি প্রথম আনসারের মন্তব্যে কারণটি ব্যাখ্যা করেছি।
গিলিয়াম পেরেট

4
তারকাচিহ্নিত / ট্র্যাক করার সমস্যাটি এখানে আছে জিডিয়ো.কম / পি / অ্যান্ড্রয়েড / issues / detail ? id=38482 সত্যই এটি প্রয়োজন ....
ব্র্যান্ডল

উত্তর:


147

আপনি 100% পারবেন না।

এটি এই গুগল আই / ও ২০১২ ভিডিওতে জিজ্ঞাসা করা হয়েছে এবং নতুন বিজ্ঞপ্তির জন্য প্রকল্পের নেতৃত্ব ঘোষণা করে যে আপনি পারবেন না।


সম্পাদনা করুন

২০১ update আপডেট: এখন আপনি এটি পরীক্ষা করতে পারেন, যেমনটি গুগলের আই / ও ২০১ O ভিডিওতে বলা হয়েছে

ব্যবহারের NotificationManagerCompat.areNotificationsEnabled()সমর্থন লাইব্রেরি থেকে, চেক যদি বিজ্ঞপ্তিগুলি এপিআই 19+ ব্লক করা হয়। এপিআই 19 এর নীচের সংস্করণগুলি সত্য ফিরে আসবে (বিজ্ঞপ্তিগুলি সক্ষম করা আছে)।

এখানে চিত্র বর্ণনা লিখুন


4
ভিডিওটিতে এমন কিছু নেই যা আমরা এই সেটিংটি পড়তে পারি না showing কেবল পরিষ্কার করার জন্য: আমি কেবল চেক বাক্সের বর্তমান অবস্থাটি পড়তে সক্ষম হতে চাই, এটি পরিবর্তন না করে। আমি ভয় করি আপনি আমার প্রশ্নটি বুঝতে পারেন নি।
গিলিয়াম পেরেট

4
আমাদের এটি প্রয়োজন কারণ আমরা একবারে 1 টি বিজ্ঞপ্তি দেখি (যা অ্যাপে বা সিস্টেম বারে থাকতে পারে)। যদি কোনও সিস্টেমের বিজ্ঞপ্তি প্রদর্শিত হয় তবে আমরা অ্যাপ্লিকেশন ব্যানার এবং এর বিপরীতে কোনও প্রদর্শন করি না। যদি কোনও বিজ্ঞপ্তি প্রদর্শিত হয় কিনা তা আমরা যদি জানতে না পারি তবে আমরা এর জীবনচক্রটি আর পরিচালনা করতে পারি না। আমার ধারণা আমরা এখন বিজ্ঞপ্তিগুলি পরিচালনা করার পদ্ধতিটি পুরোপুরি বদলাতে হবে ...
গিলিয়াম পেরেট

9
এফওয়াইআই, ভিডিওটিতে 48 প্রশ্নে (প্রশ্নোত্তর চলাকালীন) একটি সংক্ষিপ্ত শব্দ সহ প্রশ্নটি করা হয়েছে (এবং উত্তর দেওয়া হয়েছে) ... না। youtube.com/…
21

4
সম্পূর্ণ লিঙ্ক সহ @ স্ট্যাভ্রস_স আপডেট উত্তর। নোটিফিকেশন ম্যানেজারকম্প্যাট.এরনোটিকেশনস সক্ষম ()
সুফিয়ান

17
@ স্ট্যাভ্রোস_ আপনার ব্যবহার করা দরকারNotificationManagerCompat.from(ctx).areNotificationsEnabled()
আলেকজান্দ্রো

39

@ ব্লুন্ডেল থেকে উত্তর সঠিক তবে নতুন সংস্করণে সামান্য পরিবর্তন রয়েছে is

NotificationManagerCompat.from(context).areNotificationsEnabled()

38

আসলে এটি করা বেশ সহজ:

/**
 * Created by desgraci on 5/7/15.
*/
public class NotificationsUtils {

    private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
    private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

    public static boolean isNotificationEnabled(Context context) {

        AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);

        ApplicationInfo appInfo = context.getApplicationInfo();

        String pkg = context.getApplicationContext().getPackageName();

        int uid = appInfo.uid;

        Class appOpsClass = null; /* Context.APP_OPS_MANAGER */

        try {

            appOpsClass = Class.forName(AppOpsManager.class.getName());

            Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);

            Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
            int value = (int)opPostNotificationValue.get(Integer.class);

            return ((int)checkOpNoThrowMethod.invoke(mAppOps,value, uid, pkg) == AppOpsManager.MODE_ALLOWED);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return false;
    }
}

4
প্রশ্নটি পোস্ট করার সময়, অ্যান্ড্রয়েড ৪.১ বর্তমান ছিল, এটি কেবল অ্যান্ড্রয়েড ৪.৪++ এর জন্য এবং এটি প্রতিবিম্ব ব্যবহার করে বলে মনে হয় এবং নথিপত্রগুলি এটি কোনও নন সিস্টেম অ্যাপের জন্য ব্যবহার করার পরামর্শ দেয় না।
গিলিয়াম পেরেট

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

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

4
@ রাহুল ম্যাট, গ্লোবাল কনটেক্সট কেবলমাত্র একটি ইউটিলিটি ক্লাস যা আমি একটি প্রসঙ্গের রেফারেন্স রাখতে ব্যবহার করি, আপনি যদি সেই কাঠামোটি ব্যবহার করতে / বা ব্যবহার করতে ইচ্ছুক না হন তবে আপনি পদ্ধতিটির মাধ্যমে একটি বিষয়বস্তু পাস করতে পারেন। আশাকরি এটা সাহায্য করবে!
দেশগ্র্যাসি

4
আমি আশা করি তারা এগুলি করবে না: p তবে গুগল এক্সডি থেকে আসছে, যেহেতু এটি প্রতিবিম্বটি ব্যবহার করে, একই সমস্যাটির সাথে নিজেকে লড়াই করে খুঁজে পাওয়ার পরে OP_POST_NOTIFICATION গ্রেপের কোডের মাধ্যমে পড়ছিল।
desgraci

5

আপনি যদি জামারিন ব্যবহার করেন এবং আপনার এই উত্তরটির প্রয়োজন হয় আপনি এই কোডটি ব্যবহার করতে পারেন:

//return true if this option is not supported.
public class NotificationsUtils 
{
    private const String CHECK_OP_NO_THROW = "checkOpNoThrow";
    private const String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

    public static bool IsNotificationEnabled(global::Android.Content.Context context) {

        AppOpsManager mAppOps = (AppOpsManager) context.GetSystemService(global::Android.Content.Context.AppOpsService);

        ApplicationInfo appInfo = context.ApplicationInfo;

        String pkg = context.ApplicationContext.PackageName;

        int uid = appInfo.Uid;

        try {

            var appOpsClass = Java.Lang.Class.ForName("android.app.AppOpsManager");
            var checkOpNoThrowMethod = appOpsClass.GetMethod(CHECK_OP_NO_THROW,Java.Lang.Integer.Type,Java.Lang.Integer.Type,new Java.Lang.String().Class);//need to add String.Type

            var opPostNotificationValue = appOpsClass.GetDeclaredField (OP_POST_NOTIFICATION);
            var value = (int)opPostNotificationValue.GetInt(Java.Lang.Integer.Type);
            var mode = (int)checkOpNoThrowMethod.Invoke(mAppOps,value, uid, pkg);
            return (mode == (int)AppOpsManagerMode.Allowed);

        } catch (Exception) 
        {
            System.Diagnostics.Debug.WriteLine  ("Notification services is off or not supported");
        } 
        return true;
    }
}

@ অ্যাডামপ্যাডলি আরনোটিকেশনস সক্ষম () এপিআই 24 ডেভেলপার.অ্যান্ড্রয়েড.
সুন কেজারগার্ড

আপনি সঠিক, এটি আগে ভুল পড়ে থাকতে হবে। আমি আমার মূল মন্তব্যটি মুছলাম, যাতে কাউকে বিভ্রান্ত না করা।
আদম

5

দেখে মনে হচ্ছে বিজ্ঞপ্তি স্থিতির অনুসন্ধানের কোনও উপায় নেই।

আমি এটি সুপারিশ:

  • বিজ্ঞপ্তি সহ অ্যাপ্লিকেশন ডিজাইন করুন।
  • ব্যবহারকারীকে অ্যাপ্লিকেশনটির সেটিংস থেকে বিজ্ঞপ্তি অক্ষম করতে দিন।
  • বিজ্ঞপ্তি ক্লিক করা আছে কিনা তা পরীক্ষা করে দেখুন। যদি ব্যবহারকারী বিজ্ঞপ্তি ক্লিক করে, এটি পছন্দগুলিতে সংরক্ষণ করুন।
  • আপনার অ্যাপ্লিকেশনটিতে, যদি বিজ্ঞপ্তি সেটিং চালু থাকে এবং ব্যবহারকারী যদি অ্যান্ড্রয়েড ৪.১++ (এপিআই 16) থাকে তবে ব্যবহারকারী যদি কিছু দিন / সপ্তাহের জন্য বিজ্ঞপ্তিটি ক্লিক না করেন তবে ধরে নিন যে ব্যবহারকারী বিজ্ঞপ্তিগুলি অক্ষম করে।

100% সঠিক নয়। কিন্তু এটি একটি মতামত দেয়।
উদাহরণস্বরূপ যদি ব্যবহারকারী 10-15 দিনের জন্য কোনও অ্যাপ নোটিফিকেশন ক্লিক না করে, সম্ভবত তিনি এটিকে অক্ষম করেছেন


4
এটি একটি খুব বিস্তৃত এবং বিমূর্ত পদ্ধতি।
ইগোরগানাপলস্কি

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

2

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

    /**
     * Checking Whether notifications are enabled or not
     * @return true if notifications are enabled otherwise false
     */
    public static final String CHANNEL_ID = "your_channel_id";

    private boolean isNotificationChannelEnabled(){
        if(NotificationManagerCompat.from(this).areNotificationsEnabled()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                NotificationChannel channel = manager.getNotificationChannel(CHANNEL_ID);
                if (channel == null)
                    return true; //channel is not yet created so return boolean
                // by only checking whether notifications enabled or not
                return channel.getImportance() != NotificationManager.IMPORTANCE_NONE;
            }
            return true;
        }
        return false;
    }

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