Come colbind il button Power in Android?

Su un dispositivo Android, where gli unici pulsanti sono i pulsanti di volume e un button di accensione, voglio che l'applicazione reagisca a premere il button di accensione (lungo e breve). Come è fatto?

  • Android AdMob e Maven
  • Errore OutOfMemory durante l'accesso a grandi immagini
  • I dati di analisi per Android L non sono riusciti. Non è supportta la versione major.minor 51.0
  • come posso aggiungere il file aidl a studio Android (dall'esempio di fatturazione in-app)
  • OSMDroid: esempio onTap
  • Come tweet sia URL che Hashtags
  • 7 Solutions collect form web for “Come colbind il button Power in Android?”

    Le risposte esistenti non rispondono in modo completo alla domanda e lasciano abbastanza dettagli che non functionranno senza ulteriori indagini. Condivido quello che ho imparato a risolvere questo problema.

    Innanzitutto è necessario aggiungere la seguente authorization al file manifesto:

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

    Per gestire presse brevi e lunghe aggiungere la seguente class di attività:

     @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_POWER) { // Do something here... 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) { // Do something here... return true; } return super.onKeyLongPress(keyCode, event); } 

    Nota: Vale la pena notare che onKeyDown () si spara più volte prima di eseguire onKeyLongPress in modo che si desideri triggersre onKeyUp () invece o un'altra logica per evitare di agire su una serie di chiamate onKeyDown () quando l'utente è veramente tenuta .

    Penso che questa parte successiva sia solo per il Cyanogenmod. Se la costante PREVENT_POWER_KEY è indefinita, allora non dovresti aver bisogno.

    Per avviare l'intercettazione del tasto di alimentazione, è necessario impostare la seguente bandiera dall'attività:

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

    Per interrompere l'intercettazione del tasto di alimentazione (consentendo funzionalità standard):

     getWindow().clearFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY); 

    È ansible passare avanti e indietro tra le due modalità ripetutamente nel programma se lo si desidera.

    Soluzione:

     @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) { Intent i = new Intent(this, ActivitySetupMenu.class); startActivity(i); return true; } return super.dispatchKeyEvent(event); } 

    Su di voi aggiunge attività:

     public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_POWER) { // do what you want with the power button return true; } return super.onKeyDown(keyCode, event); } 

    Anche se … questo tipo di chiavi è in qualche modo speciale … non so se possa dare problemi a te.

    Come indicato qui https://stackoverflow.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); } } 

    Condivisione di un metodo per ascoltare la pressione del tasto Power. Funziona con API 23+ autorizzazioni:

    1. Chiedere l'authorization del sistema per disegnare l'overlay (questa non è un'authorization normale o vulnerabile). Questa non è un'authorization dell'utente, quindi dovresti sapere veramente cosa stai facendo, chiedendola.

       public class MainActivity extends AppCompatActivity { public final static int REQUEST_CODE = 10101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkDrawOverlayPermission()) { startService(new Intent(this, PowerButtonService.class)); } } public boolean checkDrawOverlayPermission() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return true; } if (!Settings.canDrawOverlays(this)) { /** if not construct intent to request permission */ Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); /** request permission via start activity for result */ startActivityForResult(intent, REQUEST_CODE); return false; } else { return true; } } @Override @TargetApi(Build.VERSION_CODES.M) protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE) { if (Settings.canDrawOverlays(this)) { startService(new Intent(this, PowerButtonService.class)); } } } } 
    2. Avvio di un servizio e aggiunge una vista speciale a WindowManager

    3. In attesa di un'azione all'interno del metodo onCloseSystemDialogs .

       public class PowerButtonService extends Service { public PowerButtonService() { } @Override public void onCreate() { super.onCreate(); LinearLayout mLinear = new LinearLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { if ("globalactions".equals(reason)) { Log.i("Key", "Long press on power button"); } else if ("homekey".equals(reason)) { //home key pressed } else if ("recentapss".equals(reason)) { // recent apps button clicked } } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA || event.getKeyCode() == KeyEvent.KEYCODE_POWER) { Log.i("Key", "keycode " + event.getKeyCode()); } return super.dispatchKeyEvent(event); } }; mLinear.setFocusable(true); View mView = LayoutInflater.from(this).inflate(R.layout.service_layout, mLinear); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //params WindowManager.LayoutParams params = new WindowManager.LayoutParams( 100, 100, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, params); } @Override public IBinder onBind(Intent intent) { return null; } } 

    Manifesto:

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="powerbuttonpress"> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <service android:name=".PowerButtonService" android:enabled="true" android:exported="true"> </service> </application> </manifest> 

    service_layout:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> </LinearLayout> 

    È ansible sovrascrivere le public boolean onKeyDown(int keyCode, KeyEvent event) e public boolean onKeyUp(int keyCode, KeyEvent event) nella tua class Attività e verificare se il keyCode è uguale a KeyEvent.KEYCODE_POWER .

    Non ho provato questo, ma suppongo che il sistema tratti questo come se fai la chiave Home in quanto non si riesce a bloccare il sistema dal ricevere l'evento chiave, si può solo osservare che si verifica. Per verificare questo, prova a restituire True dalle funzioni sopra descritte e vedere se quest'ultima cattura l'evento chiave.

    è necessario utilizzare questo:

     BroadcastReceiver screenoff = new BroadcastReceiver() { public static final String Screenoff = "android.intent.action.SCREEN_OFF"; @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals(Screenoff)) return; //put code to handle power press here return; }}; 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.