-1

Я хочу что-то сделать, когда гарнитура подключена, когда мое приложение работает в фоновом режиме. (Если это возможно, я хочу сделать это с радиовещательным приемником)Сделайте что-нибудь, когда гарнитура подключена, когда мое приложение работает в фоновом режиме. (если возможно, я хочу сделать это с широковещательными приемниками)

Я попытался код ниже:

--ReceiveBroadcast--

package com.example.openmusiconheadsetconnect; 

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

public class ReceiveBroadcast extends BroadcastReceiver { 
    public ReceiveBroadcast() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context,"Received!",Toast.LENGTH_LONG).show(); 
    } 
} 

--Manifest--

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.openmusiconheadsetconnect" > 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <receiver 
      android:name=".ReceiveBroadcast" 
      android:enabled="true" 
      android:exported="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.HEADSET_PLUG" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

Спасибо!

+0

проверки по этой ссылке: http://stackoverflow.com/questions/13610258/how-to-detect-when-a-user-plugs-headset -он-андроид-устройство-противоположное-действие-a – AADProgramming

+0

почему downvote? –

ответ

1

Ваш код верный, но насколько я знаю, вы не можете поместить фильтр HEADSET_PLUG в манифест. Вместо этого создайте приемник в своем классе, и сделать его слушать USER_PRESENT (экран разблокируется) или BOOT_COMPLETED в манифесте:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<receiver android:name="classes.myReceiver" >   
      <intent-filter> 
       <action android:name="android.intent.action.USER_PRESENT" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
    </receiver> 

При срабатывании таких событий, приемник должен запустить службу:

public class myReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context ctx, Intent intent) {  
     Intent service = new Intent(ctx, VoiceLaunchService.class); 
     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)||intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
      ctx.startService(service); 
      } 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      ctx.stopService(service); 
      } 
     } 

Теперь сервис будет регистрировать приемник, который будет прослушивать в HEADSET_PLUG намерениях, в OnCreate метод:

@Override 
public void onCreate() { 
    super.onCreate(); 
    speechReconRx=new SpeechReconControlReceiver(this);//"this" will allow you to call service's methods from the receiver 
    registerReceiver(speechReconRx, new IntentFilter(Intent.HEADSET_PLUG)); 
    } 

Это хлопот, но вам это понадобится, если вы не хотите использовать какую-либо деятельность. Это ошибка Google за то, что мы не выпустили приемники PLUG в манифест! Наконец сделать Broadcast, которая будет принимать меры, когда гарнитура подключена

public class SpeechReconControlReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context ctx, Intent intent) {  
     Log.e("joshcsr","HEADSET PLUGGED!"); 
     if(intent.getStringExtra("command")!=null){ 
      c=intent.getStringExtra("command"); 
      } 
     //run some methods from the service 
     if (c.equals("resume")) {   
      sService.resume(); 
      } 

     if (c.equals("pause")) {    
      sService.pause(); 
      } 

     if (c.equals("stop")) {   
      sService.stop(); 
      }  
     } 
    } 

Завернуть до вам понадобится:. * Приемник для BOOT/разблокировки экрана события. * Служба, которая удерживает все, что будет работать на заднем плане, и зарегистрировать прослушивание в гарнитуре. * И приемник для гарнитуры Plug, который будет принимать меры и методы вызова, размещенные в службе.

Я сделал это вчера, и он работает от Jelly bean до Lollipop ... и, возможно, даже более старых версий. Приветствия.

+0

Могу ли я просто создать «mainactivity» без «пользовательского интерфейса»? Я хочу, чтобы мое приложение запускалось в фоновом режиме. –

+0

@SuperThomasLab Конечно, с немного иным подходом. Проверьте мой улучшенный ответ выше ... – Josh

0

Сначала вам нужно разрешение на запуск приложения в фоновом режиме после завершения загрузки.

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

, а также указать это в вашем радиовещательного приемника,

<receiver android:name=".YourBroadcastReceiver" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
    </intent-filter> 
</receiver> 

Затем создайте service, что запуска приложения в фоновом режиме, а также в использовании услуг AudioManager.isWiredHeadsetOn(), чтобы проверить, если подключена гарнитура. И если да, выполните нужную задачу.

while(AudioManager.isWiredHeadsetOn()){ 
    //your task goes here 
} 

также добавить разрешение в manifest

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
+0

Я хочу, чтобы мое приложение начиналось в фоновом режиме при загрузке телефона. –

+0

@SuperThomasLab вы хотите, чтобы ваше приложение запускалось при загрузке телефона? И выполнить задачу в фоновом режиме, если гарнитура подключена? – Apurva

+0

Да, это так. Я хочу запустить приложение, когда гарнитура подключена. –