android - पावर बटन लंबे प्रेस का पता लगाएं




events (8)

मैं यहां कुछ पोस्ट पढ़ रहा हूं स्टैकओवरफ़्लो, और मुझे एक अच्छा समाधान नहीं मिला, मैं सोच रहा हूं कि क्या यह पता लगाना संभव है कि डिवाइस को बंद करने की कोशिश करते समय उपयोगकर्ता लंबे समय तक पावर बटन दबाए रखता है, मुझे अच्छा लगेगा। यह जानने के लिए कि क्या आप उस घटना का पता लगा सकते हैं, और उस डायलॉग को दिखाते हैं या नहीं दिखाते हैं (पुनः आरंभ, शट डाउन, आदि ...)

मैंने यह कोशिश की है:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
        Toast.makeText(MainActivity.this, event.getKeyCode(), Toast.LENGTH_SHORT).show();
    return true;
}

लेकिन यह दिखाई नहीं देता है, यह भी एक सेवा के रूप में काम करना चाहिए, मेरा मतलब है कि ऐप उस टोस्ट को दिखाने के लिए खोला या नहीं खोला जा सकता है।

संपादित करें

इस तरह से मैंने onCloseSystemDialog डाला

//home or recent button
public void onCloseSystemDialogs(String reason) {
    if ("globalactions".equals(reason)) {
        Toast.makeText(PowerButtonService.this, "yaps", Toast.LENGTH_SHORT).show();
        Intent i= new Intent(getBaseContext(), Demo.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getApplication().startActivity(i);
    //} else if ("homekey".equals(reason)) {
        //home key pressed
    //} else if ("recentapss".equals(reason)) {
        // recent apps button clicked
    }
}

यह ठीक काम करता है, लेकिन जब डिवाइस लॉक किया जाता है, तब ही जब डिवाइस लॉक होता है तो कुछ भी दिखाई नहीं दे रहा है।

इसके अलावा मैं यह पता लगाने की कोशिश कर रहा हूं कि जब उपयोगकर्ता पावरबटन क्लिक करता है तो मैंने संवाद को कैसे हटाया है:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

लेकिन अगर मैं इसे फिर से दिखाना चाहता हूं, तो मैं यह कैसे कर सकता हूं?


लॉन्ग प्रेस के लिए .... कृपया इसे आजमाएँ ...

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    Log.i(TAG,"Accessibilityevent");
    if (event == null || event.getPackageName()==null||event.getClassName()==null)
        return;


    if (event.getClassName().toString().contains("globalactions")){
        //TRIGGER YOUR CODE HERE

    }
        ....

परीक्षण के लिए पावर शो टोस्ट का लॉन्ग प्रेस बटन ...


Skizo-ozᴉʞS सवाल से, जो मैं समझता हूं, आप वास्तव में पावर बटन के व्यवहार को रोकना चाहते हैं और ऐसा नहीं किया जा सकता है। जैसे होम बटन को दबाया जाता है, वैसे ही एंड्रॉइड में कुछ घटनाओं को रोका जा सकता है, ऐसे लोगों से बचने के लिए जिन्हें वे छोड़ नहीं सकते।


आर। ज़ागोर्स्की द्वारा ऊपर इस्तेमाल की गई विधि ने लंबे समय तक मेरे लिए बहुत अच्छा काम किया, लेकिन एंड्रॉइड 9 के कुछ संशोधन से onCloseSystemDialogs विधि ने " वैश्वीकरण " प्राप्त करना बंद कर दिया।

वर्कअराउंड के रूप में, मेरा ऐप पहले से ही एक्सेसिबिलिटी का उपयोग कर रहा है। AccessibilityService के अंदर से आप इस कोड को onAccessibilityEvent में जोड़ सकते हैं

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.WindowManager;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class demo extends Activity {


    private final List<Integer> blockedKeys = new ArrayList<>(Arrays.asList(KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_POWER));


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        setContentView(R.layout.demo);


    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (!hasFocus) {
            // Close every kind of system dialog
            Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);
            Toast.makeText(demo.this, "Your LongPress Power Button", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onBackPressed() {
        // nothing to do here
        // … really
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (blockedKeys.contains(event.getKeyCode())) {


            return true;
        } else {

            return super.dispatchKeyEvent(event);
        }
    }
}

ध्यान दें कि मैंने टिप्पणी " ट्राइगर योर कोड हियर" रखी थी, मैं वास्तव में उसी कोड को कॉल करता हूं जो पहले onCloseSystemDialogs में था।

ध्यान दें कि अभी तक यह केवल एक पिक्सेल 2 पर काम कर रहा है जो नवीनतम एंड्रॉइड चल रहा है। मेरे पास हाल ही में पर्याप्त संस्करण चलाने वाला कोई अन्य फोन नहीं है, इसलिए यह परीक्षण नहीं कर सकता है कि क्या समाधान फोन में पर्याप्त रूप से सामान्य है।


इसके साथ जाओ

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

और जब आप उस घटना को कैप्चर करना चाहते हैं तो ऐसा करें

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_POWER) {
        // this is method which detect press even of button
        event.startTracking(); // Needed to track long presses
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_POWER) {
        // Here we can detect long press of power button
        return true;
    }
    return super.onKeyLongPress(keyCode, event);
}

यह प्रसारण रिसीवर के साथ किया जा सकता है। इस उत्तर को देखें


इसे इस्तेमाल करे :

 @Override
   public boolean onKeyLongPress( int keyCode, KeyEvent event ) {
     if( keyCode == KeyEvent.KEYCODE_POWER ) {
       //Handle what you want in long press.

       return true;
     }
     return super.onKeyLongPress( keyCode, event );
   }

इसे मेनिफेस्ट में जोड़ें:

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

मैं पावरबटन को हुक करने की कोशिश करते हुए कई जवाब देखता हूं। हालांकि, शटडाउन इवेंट के लिए सुनना ज्यादा आसान नहीं होगा? मुझे यकीन नहीं है कि यह आपकी ज़रूरत पर फिट बैठता है, लेकिन ऐसा लगता है।

बस एक ब्राडक्रेसीवर को निम्नलिखित action(s) लिए पंजीकृत करें:

<receiver android:name=".ShutdownReceiver">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_SHUTDOWN" />
        <action android:name="android.intent.action.QUICKBOOT_POWEROFF" />
    </intent-filter>
</receiver>

निम्नलिखित अनुमति जोड़ना न भूलें:

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


स्वीकृत उत्तर एंड्रॉइड Oreo तक त्रुटिपूर्ण काम करता है, लेकिन Android P में नहीं। Android P में इसे काम करने के लिए आपको एक्सेसिबिलिटी सर्विस का उपयोग करना होगा

सेवा वर्ग

import android.accessibilityservice.AccessibilityService;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;

import com.bm.yucasa.Utils.LocationSetup;

import static com.bm.yucasa.controller.AppController.TAG;

public class PowerServiceTwo extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.i(TAG,"Accessibilityevent");
        if (event == null || event.getPackageName()==null||event.getClassName()==null)
            return;


        if (event.getClassName().toString().contains("globalactions")){
            LocationSetup locationSetup = 
LocationSetup.getInstance(PowerServiceTwo.this);
            if (locationSetup.isConnected) {
                locationSetup.startOnDemandLocationUpdates(false, "0");
            } else {

                //Toast.makeText(getApplicationContext(), "please check gps", Toast.LENGTH_SHORT).show();
            }

        }
    }

    @Override
    public void onInterrupt() {

    }
}

जैसा कि आप एक पहुँच सेवा शुरू करने के लिए startService () विधि का उपयोग नहीं कर सकते,

तो यहाँ है कि आप इसे कैसे सक्षम कर सकते हैं।

Intent openSettings = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
openSettings.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(openSettings);

आप ऑनकेडाउन विधि को ओवरराइड करके पावर बटन इवेंट को पकड़ सकते हैं

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) {
            Log.e("key","long");
            /*//disable the system dialog
            Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);*/
            Toast.makeText(getApplicationContext(),"Power",Toast.LENGTH_SHORT).show();
        }
        return super.onKeyDown(keyCode, event);
    }

मेरे ज्ञान के रूप में हम इसे बाहर की गतिविधि (जैसे पृष्ठभूमि सेवा) नहीं कर सकते





events