android होम बटन की तरह पावर बटन ओवरराइड करें




override home-button (5)

खैर, मैं कुछ कर रहा हूं जिसमें मैं डिवाइस के सभी हार्ड बटन को अक्षम करना चाहता हूं।

पावर, होम, वॉल्यूम अप, वॉल्यूम डाउन, सर्च, बैक जैसे हार्ड बटन।

मैंने पावर को छोड़कर here लगभग सभी बटन सफलतापूर्वक ओवरराइड कर दिए हैं।

इसलिए मैं चाहता हूं कि आप लोग देखें और कृपया कुछ विचार साझा करें ताकि मैं इससे दूर हो सकूं।

मुझे onDispatchKeyEvent() लंबी प्रेस पावर onDispatchKeyEvent() मिल रही है, वैसे ही मैं इसके छोटे क्लिक को पकड़ना चाहता हूं। इसके अलावा जब बिजली दबाते हुए मैंने SCREEN_OFF का Broadcast प्राप्त करके स्क्रीन बंद करने का भी प्रयास किया और मैं इसे प्राप्त करने में सफल रहा लेकिन मैं इसे संभालने में सक्षम नहीं था।

धन्यवाद।

फिर, मैंने एक रिसीवरस्क्रीन बनाया था जिसे स्क्रीन चालू / बंद प्रसारण प्राप्त होता है

ReceiverScreen.java

public class ReceiverScreen extends BroadcastReceiver {

    public static boolean wasScreenOn = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // do whatever you need to do here
            wasScreenOn = false;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // and do whatever you need to do here
            wasScreenOn = true;
        }
    }
}

DisableHardButton.java

public class DisableHardButton extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    BroadcastReceiver mReceiver = new ReceiverScreen();
    registerReceiver(mReceiver, filter);
    }

@Override
    protected void onPause() {
        // when the screen is about to turn off
        if (ScreenReceiver.wasScreenOn) {
            // this is the case when onPause() is called by the system due to a screen state change
            System.out.println("SCREEN TURNED OFF");

    } else {
        // this is when onPause() is called when the screen state has not changed
    }
    super.onPause();
}

@Override
protected void onResume() {
    // only when screen turns on
    if (!ScreenReceiver.wasScreenOn) {
        // this is when onResume() is called due to a screen state change
        System.out.println("SCREEN TURNED ON");
    } else {
        // this is when onResume() is called when the screen state has not changed
    }
    super.onResume();
}
}

मैंने जो किया है वह यहां है:

(1) एक रिसीवर वर्ग बनाएँ:

public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        switch (action) {
            case Intent.ACTION_SCREEN_OFF:
                BaseActivity.unlockScreen();
                break;

            case Intent.ACTION_SCREEN_ON:
                // and do whatever you need to do here
                BaseActivity.clearScreen();
        }
    }
}

(2) उपरोक्त नामित दो विधियां इस तरह दिखती हैं:

public static void unlockScreen () {
    if (current == null) return;

    Log.i( Constants.TAG, "Turning on screen ... " );

    Window window = current.getWindow();
    window.addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD );
    window.addFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED );
    window.addFlags( WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON   );
}

public static void clearScreen () {
    if (current == null) return;

    Log.i( Constants.TAG, "Clearing screen flag when on ... " );

    Window window = current.getWindow();
    window.clearFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD );
    window.clearFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED );
    window.clearFlags( WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON   );
}

private static BaseActivity current;

@Override
protected void onResume () {
    current = this;
}

(3) मुख्य गतिविधि वर्ग में क्रेट () विधि रिसीवर पंजीकृत करें:

    IntentFilter filter = new IntentFilter( Intent.ACTION_SCREEN_ON );
    filter.addAction( Intent.ACTION_SCREEN_OFF );
    registerReceiver(new ScreenReceiver(), filter);

सभी उत्तरों के विपरीत .. इसे देखें:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
                Log.i("", "Dispath event power");
                Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
                sendBroadcast(closeDialog);
                return true;
        }

        return super.dispatchKeyEvent(event);
}

यह क्या करता है:

जब भी उपयोगकर्ता पावर बटन दबाता है। हमने इसे देखने से पहले डायलॉग रद्द कर दिया !! :)। यह मेरे लिए काम करता है .. (नोट 2 पर परीक्षण किया गया)


आप पावर बटन प्रेस के बारे में जान सकते हैं, लेकिन मुझे नहीं लगता कि आपको इसे ओवरराइड करना होगा और आप बिजली बंद करने के लिए संवाद को खारिज कर पाएंगे और कुछ और दिखा सकते हैं।

यहां मैंने जो कोशिश की है,

package com.easylogs.app;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class CloseSystemDialogsIntentReceiver extends BroadcastReceiver {
    public void onReceive(final Context context, final Intent intent) {
        Log.i("HERE", "------------------------------------HERE");
        Toast.makeText(context, "OFFFFFFFFFFFFFFFF",Toast.LENGTH_LONG).show();
    }
}

और घोषणापत्र में घोषणा के रूप में,

    <receiver android:name="CloseSystemDialogsIntentReceiver">
    <intent-filter>
            <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

मुझे बहुत देर हो चुकी है, लेकिन भविष्य में अन्य डेवलपर्स के लिए सहायक हो सकता है। एंड्रॉइड एन पर परीक्षण किया। https://.com/a/15828592/1065357 से संदर्भ

 @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(!hasFocus) {
           Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);
        }
    }

ओह। यह काफी विपरीत सवाल है, इसके पीछे एक बड़ी टिप्पणी है।

मुझे अपने प्रश्न को थोड़ा सा दोबारा शुरू करने दें। अगर मैं स्पष्ट रूप से समझता हूं, तो आप अपनी गतिविधि की अवधि के लिए डिवाइस पर सभी भौतिक बटन अक्षम करना चाहते हैं। इसमें पावर बटन शामिल है, जिसे आप ACTION_SCREEN_OFF मंशा को संभालने के द्वारा पता लगाते हैं। इस परिदृश्य के लिए आपका वर्तमान (सफल) वर्कअराउंड एक ACTION_SCREEN_ON प्रसारित करना है, स्क्रीन बंद होने पर स्क्रीन को वापस लात मारना, बशर्ते मेजबान इसे सही तरीके से कार्यान्वित करे।

अब आप इस क्रिया को अनावश्यक रूप से प्रस्तुत करके अतिरिक्त मील जाना चाहेंगे, अगर (और केवल तभी) आप सिस्टम पर भेजे जाने से पहले ACTION_SCREEN_OFF को पकड़ और संभालने में सक्षम हैं। क्या यह संभव है और यदि ऐसा हो तो कैसे?

यह कुछ चर्चा भालू। हालांकि, लघु संस्करण सरल है: सीमित नहीं है, डिवाइसों की सीमित संख्या के लिए, आपके फर्मवेयर या एंड्रॉइड ऑपरेटिंग सिस्टम के मूल में कस्टम संशोधन के बिना यह संभव नहीं है।

जहां तक ​​दस्तावेज है, एंड्रॉइड सिस्टम, इसे प्रसारण कार्रवाई के रूप में परिभाषित करता है । संदेश प्रचार के प्रकाशन-सदस्यता पत्र के बाद, यह संदेश इस कार्रवाई के सभी संबंधित पक्षों को सूचित करेगा। चूंकि यह संदेश सिस्टम द्वारा भेजा जाता है, क्योंकि संदेश स्टैक सिस्टम द्वारा प्रबंधित किया जाता है, और क्योंकि सिस्टम द्वारा संदेश भी प्राप्त होता है, इसलिए आपके कोड को इस संदेश के स्वागत को अवरुद्ध करने के लिए सही जगह पर इंजेक्शन नहीं दिया जाता है।

इसके अलावा, कुछ उपकरणों के लिए, यह एक भौतिक स्विच होगा जिसमें कोई भी प्रोग्रामेटिक बाधा नहीं है। सबसे अच्छा, एंड्रॉइड सिस्टम घटना के दौरान संभालने की उम्मीद कर सकता है, यही कारण है कि यह प्रसारण संदेश सर्विस स्टैक में एक विशेष मामला है। मेरे ज्ञान के सर्वोत्तम और इस परिदृश्य पर स्पैस दस्तावेज के आधार पर, यही कारण है कि हम दुरुपयोग के लिए संभावित वैक्टरों पर विचार करने से पहले, आउट ऑफ़ द बॉक्स, समर्थित सुविधा नहीं है।

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

बस याद रखें, यह रणनीति मूर्खतापूर्ण नहीं है। इसे कुशलता से करें और प्रक्रिया को अच्छी तरह से दस्तावेज करें, न कि आप अगले 2600 एक्सपोज़ के लिए चारा बनें।

आपके आवेदन के साथ शुभकामनाएँ।





home-button