2012-02-24 3 views
1

В настоящее время я пытаюсь сделать широковещательный приемник, который будет вызываться после загрузки устройства Android, а затем запустит фоновый сервис. Я пробовал много примеров, но не знаю, где я ошибаюсь. Я следую этому примеру: https://github.com/commonsguy/cw-advandroid/tree/master/SystemEvents/OnBoot Я импортировал весь этот проект в свое рабочее пространство и попытался запустить. Но приемник не вызвал или так. Пожалуйста, помогите мне. Мои тестирования Устройство: Motorolla Xoom с ICS 4.0.3Android Boot-Up BroadCast Не вызывает

EDIT

Manifest

<uses-sdk android:minSdkVersion="8" /> 

<supports-screens 
    android:anyDensity="true" 
    android:largeScreens="true" 
    android:normalScreens="true" 
    android:smallScreens="true" /> 

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

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <service 
     android:name="awais.soft.MyService" 
     android:enabled="true" > 
     <intent-filter> 
      <action android:name="awais.soft.MyService" > 
      </action> 
     </intent-filter> 
    </service> 

    <receiver android:name="awais.soft.ServicesDemoActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" > 
      </action> 

      <category android:name="android.intent.category.HOME" > 
      </category> 
     </intent-filter> 
    </receiver> 
</application> 

Broadcast Receiver

package awais.soft; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.view.Menu; 

public class ServicesDemoActivity extends BroadcastReceiver { 

static final int idBut = Menu.FIRST + 1, idIntentID = Menu.FIRST + 2; 

@Override 
public void onReceive(Context context, Intent intent) { 

    Log.e("Awais", "onReceive:"); 
    if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) { 
     Intent i = new Intent(); 
     i.setAction("awais.kpsoft.MyService"); 
     context.startService(i); 

    } 

} 

}

Сервис

package awais.soft; 

import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class MyService extends Service { 
private static final String TAG = "MyService"; 
MediaPlayer player; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 

    player = MediaPlayer.create(this, R.raw.is); 
    player.setLooping(false); // Set looping 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
    player.stop(); 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 
    player.start(); 
} 

}

+0

не написан в манифесте –

+0

Это была ошибка типа, исправленная позже. –

+0

Прошу опубликовать ваше редактируемое кодирование, так что я могу получить –

ответ

1

Все было хорошо ..: S Проблема была с устройством .. (т.е. Motorolla Увеличить ICS 4.0.3)

Протестировано на Galaxy Tab 2,2 и работает нормально ..

Спасибо всем за ваше время

+2

Проблема на самом деле ICS. –

+0

lol похоже ...: [ –

+0

Вам нужно, чтобы пользователь вручную запустил ваше приложение, а затем широковещательные приемники, зарегистрированные в манифесте, должны работать после этого. Если ваше приложение не закрыто перед перезагрузкой. –

1

Я что-то подобное в мое приложение и его работа для меня.

public class DeviceBootReceiver extends BroadcastReceiver { 

    @Override 
    public final void onReceive(final Context context, final Intent intent) { 

     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
     // CustomLog.i("Boot Completed"); 
     } 
    } 
} 

Android Manifset

<receiver android:name=".model.service.DeviceBootReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
       <category android:name="android.intent.category.HOME"></category> 
      </intent-filter> 
</receiver> 

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

Пожалуйста, проверьте, если вы дали разрешение на RECEIVE_BOOT_COMPLETED

+0

уже сделано выше изменений .. .Но :( –

+0

все было хорошо ..: S проблема была с устройством .. (т.е. Motorolla Увеличить ICS 4.0.3) Теперь протестирована на Galaxy Tab 2,2 и работает отлично .. Спасибо всем за ваше время –

1

см я отправляю вас eample, который поможет вам

Для некоторых приложений вам потребуется чтобы ваша служба работала и запускалась при запуске устройства без вмешательства пользователя. Такие приложения в основном включают мониторы (телефония, Bluetooth, сообщения, другие события). По крайней мере эта функция в настоящее время разрешена преувеличенной ограничительной политикой разрешений для Android.

Шаг 1: Сначала вам нужно создать простой сервис, определенный в Monitor.java:

public class Monitor extends Service { 

private static final String    LOG_TAG = "::Monitor"; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.e(LOG_TAG, "Service created."); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    Log.e(LOG_TAG, "Service started."); 
} 
@Override 
public void onDestroy() { 
     super.onDestroy(); 
     Log.e(LOG_TAG, "Service destroyed."); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    Log.e(LOG_TAG, "Service bind."); 
    return null; 
} 

}

Шаг 2: Далее нам нужно создать Broadcast класс приемника, StartAtBootServiceReceiver.java:

public class StartAtBootServiceReceiver extends BroadcastReceiver 
    { 
    private static final String LOG_TAG=StartAtBootServiceReceiver"; 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Log.e(LOG_TAG, "onReceive:"); 
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { 
     Intent i = new Intent(); 
     i.setAction("test.package.Monitor"); 
     context.startService(i); 
    } 
} 

}

Шаг 3: И наконец, ваш AndroidManifest.XML-файл должен содержать следующее:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="test.package.Monitor" 
    android:versionName="1.0" 
    android:versionCode="100" 
    android:installLocation="internalOnly"> 
    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" /> 

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

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8"/> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <service android:name="test.package.Monitor">** 
     <intent-filter> 
      <action android:name="test.package.Monitor"> 
      </action> 
     </intent-filter> 
    </service> 
    <receiver android:name="test.package.StartAtBootServiceReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"> 
      </action> 
      <category android:name="android.intent.category.HOME"> 
      </category> 
     </intent-filter> 
    </receiver> 
</application> 

Мне нужно, чтобы выделить некоторые из наиболее важных аспектов, ключевые факторы для возможных ошибок в реализации:
1) Разрешения android.permission.RECEIVE_BOOT_COMPLETED сусла (в манифесте xml)
2) Установка должна выполняться во внутреннем хранилище, а не на SDCARD! Для применения этого использования андроида: INSTALLLOCATION = "internalOnly" в манифесте

+0

спасибо..ли попробуй. :) –

+0

да, его работала должным образом, потому что я использую это в своем приложении –

+0

ops..если не вызывать .. даже другие трансляции тоже не работают .. , как и я, проверенный на подключенном питании. Интересно, не могу ли я представить тег активности в моем манифесте ?? –

0

Если ваш телефон укоренилось, то вы будете иметь проблемы в Android загрузку-Up Broadcast вызывающих в противном случае вы должны обеспечить ваше приложение требовало разрешений корневых

+0

Как получить права root? –

0

Проблема сохраняется в случае устройств с версией для Android более 3,0, кстати, это не проблема, которую она выполнила в целях безопасности google. Угадайте. Если вам нужно запустить службу при загрузке, вам нужно сделать пользовательское намерение & транслирует его. Для создания пользовательских намерений вы должны сделать служебный файл, из которого у вас должно транслироваться это намерение при загрузке. & ваш служебный файл (который вы хотите запустить) получит это намерение по методу onReceive &, который будет запущен ваш сервис. файл службы, который вы создадите для вызова своей службы, которую вы хотите запустить, должен храниться в папке с системным/приложением файлового обозревателя устройства, если ваша файловая система показывает «изредка» файловую систему только для чтения, а затем из командной строки выполните только adb remount &, затем нажмите файл на устройстве, перезагрузите систему, ваша служба будет работать. Спасибо!