Android में होम बटन प्रेस का पता लगाएं


94

यह कुछ समय से मुझे पागल कर रहा है।

अगर किसी एंड्रॉइड एप्लिकेशन में होम बटन दबाया गया है तो क्या विश्वसनीय तरीके से पता लगाया जा सकता है?

असफल होना, क्या यह बताने का एक मजबूत तरीका है कि किस गतिविधि के कारण ऑनपॉज़ में जाना है? यानी क्या हम यह पता लगा सकते हैं कि यह एक नई गतिविधि शुरू करने या वापस / घर दबाने के कारण हुआ।

एक सुझाव जो मैंने देखा है वह ऑनपॉइंट () को ओवरराइड करना है और कॉल फ़िनिशिंग () है, लेकिन होम बटन को दबाते समय यह गलत हो जाएगा जैसे कि अगर कोई नई गतिविधि शुरू हो रही है तो यह दोनों के बीच अंतर करने में विफल रहता है।

किसी भी मदद की बहुत सराहना की।

** अद्यतन **: इस लिंक के लिए @ android- भूखा धन्यवाद: https://nishandroid.blogspot.com/

निम्नलिखित विधि पर काबू पाने:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

फिर होम बटन प्रेस के लिए निम्नलिखित घटना को निकाल दिया जाएगा:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
       //The Code Want to Perform. 
    }
});

मुझे यकीन नहीं है कि इस लाइन के साथ कोई दुष्प्रभाव हैं:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

तो ऐसा लगता है कि लोकप्रिय विश्वास के विपरीत, आप वास्तव में घर की चाबी के लिए सुन सकते हैं। चिंताजनक रूप से, आप झूठे वापस कर सकते हैं और घर की चाबी कुछ भी नहीं है।

अद्यतन : जैसा कि अपेक्षित था, इसके साथ कुछ पक्ष प्रभावित होते हैं - ऐसा लगता है कि एम्बेडेड वीडियो और Google मानचित्र इस मोड के सक्षम होने के साथ दिखाई नहीं देते हैं।

अपडेट : माना जाता है कि यह हैक अब एंड्रॉइड 4.0 के बाद काम नहीं करता है


मेरी समस्या पीठ और घर-के बीच में नहीं थी, लेकिन मैं दोनों मामलों में आवेदन खत्म करना चाहता था। जिसका उपयोग मैंने किया Activity.onUserLeaveHint()
१२:२०

एकमात्र समस्या onUserLeaveHint () भी होगी जब मैं उक्त गतिविधि से एक गतिविधि शुरू करूँगा, मैं केवल यह जानना चाहता हूं कि क्या वापस या घर दबाया गया है। सुझाव के लिए धन्यवाद
डीन वाइल्ड

यह सच है, लेकिन दुर्भाग्य से, जहां तक ​​मुझे पता है, यह होम-उपयोग पर किसी भी जानकारी को प्राप्त करने का एकमात्र स्थान है। झूठी-संगति से फसल काटने की समस्या को और अधिक बनाना, कई में से आसानी से पहचाना जा सकता है, लेकिन फिर भी आसान लगने वाले कार्य को जटिल बना देता है।
बजकर

2
@DeanWild: क्या आपने इसे पढ़ा: nisha113a5.blogspot.com
प्रतीक भाट

2
TYPE_KEYGUARD को एंड्रॉइड 5.0 में WindowManager.LayoutParams से हटा दिया गया था
theb1uro

जवाबों:


136

निम्नलिखित कोड मेरे लिए काम करता है :)

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerReceiver mReceiver;

    public HomeWatcher(Context context) {
        mContext = context;
        mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
    }

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mReceiver = new InnerReceiver();
    }

    public void startWatch() {
        if (mReceiver != null) {
            mContext.registerReceiver(mReceiver, mFilter);
        }
    }

    public void stopWatch() {
        if (mReceiver != null) {
            mContext.unregisterReceiver(mReceiver);
        }
    }

    class InnerReceiver extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                    if (mListener != null) {
                        if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                            mListener.onHomePressed();
                        } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}
public interface OnHomePressedListener {
    void onHomePressed();
    void onHomeLongPressed();
}

3
आपका onHomeLongPressedवास्तव में "रिकेट्स" सिस्टम गतिविधि के उद्घाटन के अनुरूप है। मेरे फ़ोन पर, होम बटन के बगल में स्थित पुनरावृत्ति बटन को दबाकर ट्रिगर किया गया है, इसलिए आपके कोड के बारे में यह धारणा है कि यह एक घर पर लंबे समय तक चलने वाला प्रेस हमेशा सही नहीं होता है।
सैम

यह मेरे लिए काम क्यों नहीं करता है, मैंने प्रकट रूप से प्रसारण को पंजीकृत करने के अलावा सटीक किया।
फरहान

अनुप्रयोग वर्ग में पंजीकृत, अब तक कार्य करना .. +1, मुझे आश्चर्य है कि क्या पकड़ है? मेरा मतलब है, हम किस मूल मामले को याद कर रहे हैं ..: ^)
फरहान

1
कभी-कभी इरादे ।getStringExtra (SYSTEM_DIALOG_REASON_KEY); वापसी शून्य। मैं जानना चाहूंगा कि यह क्या हो रहा है ??
फखर

1
लंबे प्रेस कारण को अब कहा जाता हैfinal String SYSTEM_DIALOG_REASON_LONG_PRESS = "assist"
JWqvist

49

यह एक पुराना सवाल है, लेकिन यह किसी की मदद कर सकता है।

@Override
protected void onUserLeaveHint()
{
    Log.d("onUserLeaveHint","Home button pressed");
    super.onUserLeaveHint();
}

प्रलेखन के अनुसार, onUserLeaveHint () विधि को उस समय कहा जाता है जब उपयोगकर्ता होम बटन पर क्लिक करता है या जब कुछ आपके एप्लिकेशन को बाधित करता है (जैसे कि एक आने वाली फोन कॉल)।

यह मेरे लिए काम करता है .. :)


26
गलत !!! यह काम होम बटन दबाकर किया जाता है, लेकिन यह तब भी काम किया जाता है जब Swiching Activity with Intent !!
निकुंज Paradva

यह onStop () से पहले निष्पादित होगा, भले ही अन्य गतिविधि शीर्ष पर आए या उपयोगकर्ता बलपूर्वक गतिविधि को छोड़ दे या होम बटन पर क्लिक करे ...
Navas pk

7

एंड्रॉइड ऐप के भीतर से होम बटन को पहचानना और उसे रोकना असंभव है। यह दुर्भावनापूर्ण ऐप्स को रोकने के लिए सिस्टम में बनाया गया है जिन्हें बाहर नहीं निकाला जा सकता


स्वीकृत उत्तर की जांच करें, यह संभव है। हालांकि अभी तक कई उपकरणों पर परीक्षण नहीं किया गया है।
डीन वाइल्ड

हाँ ... खदान पर दुर्घटनाग्रस्त ऐप।
जेरेमी लोगन

लॉन्चर / होम रिप्लेसमेंट ऐप के बारे में क्या? मैं एक निर्माण कर रहा हूं और जब उपयोगकर्ता घर पर क्लिक करते हैं तो मैं पहली स्क्रीन पर जाना चाहता हूं
lisovaccaro

लॉन्चरों के लिए इसका उपयोग करें: @Override संरक्षित शून्य onNewIntent (इरादे इरादे) {super.onNewIntent (इरादा); / * आप क्या चाहते हैं * /}
टन

@lisovaccaro लांचर और या होम रिप्लेसमेंट अभी भी google (src diane hackborn) द्वारा समर्थित नहीं हैं और इसलिए आप उपयोगकर्ता को होमबटन पर क्लिक करने से नहीं रोक सकते। आप अभी भी, सिस्टम अलर्ट डायलॉग के रूप में अपना विचार जोड़ सकते हैं, जो सब कुछ ओवरले करेगा। लेकिन होम बटन के क्लिक इसके माध्यम से जाएंगे।
JacksOnF1re

7

मुझे अपने एप्लिकेशन में पृष्ठभूमि संगीत शुरू करने / बंद करने की आवश्यकता है जब पहली गतिविधि खुलती है या बंद हो जाती है या जब किसी भी गतिविधि को होम बटन द्वारा रोका जाता है और फिर कार्य प्रबंधक से फिर से शुरू किया जाता है। शुद्ध प्लेबैक को कुछ समय के लिए संगीत में रोकना / फिर से शुरू करना Activity.onPause()और Activity.onResume()बाधित करना, इसलिए मुझे निम्नलिखित कोड लिखना पड़ा:

@Override
public void onResume() {
  super.onResume();

  // start playback here (if not playing already)
}

@Override
public void onPause() {
  super.onPause();

  ActivityManager manager = (ActivityManager) this.getSystemService(Activity.ACTIVITY_SERVICE);
  List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(Integer.MAX_VALUE);
  boolean is_finishing = this.isFinishing();
  boolean is_last = false;
  boolean is_topmost = false;
  for (ActivityManager.RunningTaskInfo task : tasks) {
    if (task.topActivity.getPackageName().startsWith("cz.matelier.skolasmyku")) {
      is_last = task.numRunning == 1;
      is_topmost = task.topActivity.equals(this.getComponentName());
      break;
    }
  }

  if ((is_finishing && is_last) || (!is_finishing && is_topmost && !mIsStarting)) {
    mIsStarting = false;
    // stop playback here
  }
}

जो केवल तभी प्लेबैक को बाधित करता है जब एप्लिकेशन (इसकी सभी गतिविधियां) बंद हो जाती हैं या जब होम बटन दबाया जाता है। Unfortunatelly मैंने onPause()शुरू की गतिविधि की विधि के कॉल के क्रम को बदलने का प्रबंधन नहीं किया है और onResume()जब शुरू किया गया Activity.startActivity()है (या onPause()उस गतिविधि का पता लगाने के लिए किसी अन्य गतिविधि को अन्य तरीके से शुरू कर रहा है) तो इस मामले को विशेष रूप से नियंत्रित किया जाना है:

private boolean mIsStarting;

@Override
public void startActivity(Intent intent) {
  mIsStarting = true;
  super.startActivity(intent);
}

एक और दोष यह है कि इसके लिए GET_TASKSअनुमति की आवश्यकता है AndroidManifest.xml:

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

इस कोड को संशोधित करना कि यह केवल होम बटन प्रेस पर प्रतिक्रिया करता है straighforward है।


4

onUserLeaveHint()गतिविधि में ओवरराइड करें । जब कोई नई गतिविधि उस पर आती है या उपयोगकर्ता बैक प्रेस दबाता है, तो गतिविधि के लिए कोई कॉलबैक नहीं होगा।


4
ऐप के भीतर एक गतिविधि से दूसरी गतिविधि में जाने पर इसे भी कहा जाता है
अमीर उराल

3

onUserLeaveHint ();

इस एक्टिविटी क्लास मेथड को ओवरराइड करें। यह होम की क्लिक पर पता लगाएगा। गतिविधि के ऑनपॉज () कॉलबैक से ठीक पहले यह तरीका कहा जाता है। लेकिन यह तब नहीं कहा जाएगा जब कोई गतिविधि बाधित होती है जैसे कि इन-कॉल गतिविधि अग्रभूमि में आती है, इसके अलावा यह रुकावट तब कॉल करेगी जब उपयोगकर्ता घर की कुंजी पर क्लिक करेगा।

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();
    Log.d(TAG, "home key clicked");
}

2

प्रत्येक स्क्रीन के लिए एक काउंटर बनाने का प्रयास करें। यदि उपयोगकर्ता होम को स्पर्श करता है, तो काउंटर शून्य होगा।

public void onStart() {
  super.onStart();
  counter++;
}

public void onStop() {
  super.onStop();
  counter--;    
  if (counter == 0) {
      // Do..
  }
}

3
यदि आपका मतलब है कि वैश्विक अनुप्रयोग काउंटर एक क्षण में शून्य हो जाएगा जब एक गतिविधि को वापस स्टैक पर ले जाया जा रहा है और दूसरे को शीर्ष पर ले जाया जा रहा है या जब शीर्ष एटिविटी समाप्त हो गई है और बैक स्टैक गतिविधि को शीर्ष पर ले जाया जा रहा है जो कि सामान्य स्थान है आप होम बटन प्रेस पर प्रतिक्रिया करना चाहते हैं। यदि आप गतिविधि-व्यापी काउंटर से मतलब रखते हैं तो यह शून्य होगा जब भी गतिविधि दिखाई न दे (जरूरी नहीं कि होम बटन प्रेस की वजह से हो)। इस संक्रमण को छोड़ने के लिए टाइमर का उपयोग करके अपनी प्रतिक्रिया को स्थगित करने का एकमात्र समाधान होगा लेकिन आवश्यक देरी पूर्वानुमान या वांछनीय नहीं हो सकती है।
ब्लैकहेक्स

2

एंड्रॉइड में वर्किंग कियोस्क मोड बनाने के लिए आप अपने पोस्ट में एंड्रियास शारद के समाधान पर विचार कर सकते हैं । यह थोड़ा हैकी है, लेकिन होम बटन के अवरोधन को रोकने के कारणों को देखते हुए इसे होना चाहिए;)


1

मुझे यह समस्या थी, और जब से onKeyDown () विधि से कुछ भी हासिल नहीं हुआ क्योंकि अंतर्निहित android प्रणाली ने इस पद्धति को कॉल नहीं किया था, मैंने इसे onBackPressed () पर ओवरराइड करने के साथ हल किया, और मेरे पास एक बूलियन मान गलत था , क्योंकि मैंने वापस दबाया, मैं आपको दिखाता हूं कि कोड में मेरा क्या मतलब है:

import android.util.Log;
public class HomeButtonActivity extends Activity {
    boolean homePressed = false;
    // override onCreate() here.

    @Override
    public void onBackPressed() {
        homePressed = false; // simply set homePressed to false
    }

    @Overide
    public void onResume() {
        super.onResume();
        homePressed = true; // default: other wise onBackPressed will set it to false
    }

    @Override
    public void onPause() {
        super.onPause();
        if(homePressed) { Log.i("homePressed", "yay"); }
    }

तो इस कारण काम किया है क्योंकि इस गतिविधि के बाहर नेविगेट करने का एकमात्र तरीका पीठ या घर को दबाकर है इसलिए यदि वापस दबाया गया था, तो मुझे पता है कि कारण घर नहीं था, लेकिन अन्यथा कारण घर था, इसलिए मैंने डिफ़ॉल्ट बूलियन सेट किया घर के लिए मूल्य सच हो। हालाँकि, यह आपके आवेदन में केवल एक ही गतिविधि उदाहरण के साथ काम करेगा क्योंकि अन्यथा आपके पास ऑनपॉज़ () विधि को कॉल करने की अधिक संभावना है।


तथ्य यह है कि जब आप किसी अन्य गतिविधि के लिए जाने में, onpause विधि कहा जाता है
Fakher

इसलिए मैंने स्पष्ट रूप से कहा है कि यह केवल तभी काम करेगा जब आपका आवेदन केवल एक गतिविधि को शामिल करे!
मोशे राबेव

और क्या होगा यदि एक ही समय में कई असंबंधित गतिविधियां चल रही हैं, और उपयोगकर्ता केवल उनके बीच स्विच कर रहा है? आधुनिक एंड्रॉइड डिवाइस मल्टी-टास्किंग का समर्थन करते हैं। इस कोड के साथ, ऐसा लगता है कि आपके ऐप पर वापस स्विच homePressedकरना सही है, और फिर किसी अन्य ऐप पर स्विच करने से लगता है कि होम को तब दबाया जाता है जब वह वास्तव में नहीं था।
रेमी लेबेउ

1

एपीआई 14 के बाद से आप फ़ंक्शन का उपयोग कर सकते हैं onTrimMemory()और ध्वज की जांच कर सकते हैं TRIM_MEMORY_UI_HIDDEN। यह आपको बताएगा कि आपका एप्लिकेशन बैकग्राउंड में जा रहा है।

तो अपने कस्टम एप्लिकेशन वर्ग में आप कुछ इस तरह लिख सकते हैं:

override fun onTrimMemory(level: Int) {
    if (level == TRIM_MEMORY_UI_HIDDEN) {
        // Application going to background, do something
    }
}

इसके गहन अध्ययन के लिए, मैं आपको इस लेख को पढ़ने के लिए आमंत्रित करता हूं: http://www.developerphil.com/no-you-can-not-override-the-home-button-but-you-dont-have -सेवा/


1
अच्छा लेख - उपयोगी विकल्प जो संभवतः सबसे अधिक लोगों को चाहिए वह है
डीन वाइल्ड

अच्छा समाधान है। क्या आप जानते हैं कि जब एप्लिकेशन पृष्ठभूमि से लौटता है तो ध्वज को कैसे रीसेट किया जाता है? उदाहरण के लिए अगर मैं एक बूलियन isInBackground बनाऊं, तो हम बैकग्राउंड से लौटने के बाद इसे रीसेट करना चाहेंगे।
माइकोसकार इको

0

आपके आवेदन के लिए एक विकल्प यह होगा कि आप android.intent.category.Home इरादे का उपयोग करके एक प्रतिस्थापन होम स्क्रीन लिखें। मेरा मानना ​​है कि इस प्रकार के इरादे आप होम बटन देख सकते हैं।

अधिक जानकारी:

http://developer.android.com/guide/topics/intents/intents-filters.html#imatch


1
दिलचस्प विचार है, लेकिन थोड़ी लंबी हवा और सुरुचिपूर्ण नहीं है जैसा कि मैंने उम्मीद की थी
डीन वाइल्ड

0

चूंकि आप केवल ऐप लॉन्च होने पर रूट गतिविधि को फिर से शुरू करने की इच्छा रखते हैं, हो सकता है कि आप प्रकट में लॉन्च मोड आदि को बदलकर यह व्यवहार प्राप्त कर सकें?

उदाहरण के लिए, क्या आपने Android को लागू करने का प्रयास किया है : ClearTaskOnLaunch = "सच" आपकी लॉन्च गतिविधि के लिए विशेषता, शायद एंड्रॉइड के साथ मिलकर : लॉन्चमोड = "singleInstance" ?

इस तरह के व्यवहार को ठीक करने के लिए टास्क और बैक स्टैक एक बेहतरीन संसाधन है।


यह सबसे सुरुचिपूर्ण समाधान की तरह प्रतीत होगा लेकिन मैंने इसे काफी अविश्वसनीय पाया है। कुछ ओपन / क्लोज / पॉज़ साइकल के बाद ऐप पूरी तरह से रीस्टार्ट होने के बजाय बस फिर से शुरू हो जाएगा
डीन वाइल्ड

0

घर की चाभी के व्यवहार को बदलना एक बुरा विचार है। यही कारण है कि Google आपको होम कुंजी को ओवरराइड करने की अनुमति नहीं देता है। मैं घर की चाबी के साथ आम तौर पर बात नहीं करूँगा। अगर आप किसी भी कारण से मातम में चले जाते हैं, तो आपको उपयोगकर्ता को अपने ऐप से बाहर निकलने का एक तरीका देना होगा।

मुझे लगता है कि किसी भी काम के आसपास अवांछित दुष्प्रभाव होंगे।


1
आप बिल्कुल हाजिर हैं, लेकिन कुछ ग्राहक जवाब के लिए नहीं लेंगे और समझ नहीं पाएंगे कि उन्हें दिशानिर्देश क्यों नहीं तोड़ने चाहिए।
डीन वाइल्ड

समस्या यह है कि यदि आप होम बटन व्यवहार का पीछा नहीं करना चाहते हैं, तो भी आपको कभी-कभी इस स्थिति पर अलग-अलग प्रतिक्रिया देनी होती है कि होम बटन के कारण एप्लिकेशन को वापस उस स्थिति में ले जाया जाता है, जिस स्थिति में आप वर्तमान गतिविधि को तरजीह के लिए रोका जाता है। कारण। एक ही समस्या इस तथ्य के साथ है कि पॉडक्शन बिल्ड्स के लिए Application.onDestroy () का उपयोग नहीं किया जा सकता है। इस तरह के उदाहरण एक गेम को रोक रहे हैं जब उपयोगकर्ता
ऐप्पिकेशन को

0

हाल ही में मैं होम प्रेस बटन का पता लगाने की कोशिश कर रहा था, क्योंकि मुझे इसे " ऑनबैकप्रेस्ड () " विधि के समान करने की आवश्यकता थी । ऐसा करने के लिए, मुझे इस तरह " onSupportNavigateUp () " विधि को ओवरराइड करना पड़ा :

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

इसने पूरी तरह से काम किया। =)


0

जैक का जवाब पूरी तरह से clickघटना के लिए काम कर रहा है, जबकि longClickयह विचार है कि menuबटन क्लिक है।

वैसे, अगर कोई सोच रहा है कि कोटलिन के माध्यम से कैसे करना है,

class HomeButtonReceiver(private var context: Context,private var listener: OnHomeButtonClickListener) {
    private val mFilter: IntentFilter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
    private var mReceiver: InnerReceiver = InnerReceiver()

    fun startWatch() {
        context.registerReceiver(mReceiver, mFilter)
    }

    fun stopWatch() {
        context.unregisterReceiver(mReceiver)
    }

    inner class InnerReceiver: BroadcastReceiver() {
        private val systemDialogReasonKey = "reason"
        private val systemDialogReasonHomeKey = "homekey"
        override fun onReceive(context: Context?, intent: Intent?) {
            val action = intent?.action
            if (action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) {
                val reason = intent.getStringExtra(systemDialogReasonKey)
                if (reason != null && reason == systemDialogReasonHomeKey) {
                    listener.onHomeButtonClick()
                }
            }
        }
    } 
}

0

यहां छवि विवरण दर्ज करें Android Home Key को फ्रेमवर्क लेयर द्वारा संभाला जाता है जिसे आप एप्लिकेशन लेयर लेवल में संभाल नहीं सकते। क्योंकि होम बटन कार्रवाई पहले से ही नीचे के स्तर में परिभाषित की गई है। लेकिन अगर आप अपने कस्टम रोम का विकास कर रहे हैं, तो यह संभव हो सकता है। Google ने सुरक्षा कारणों की वजह से होम बटन को ओवरराइड किया।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.