Использование датчика приближения в Android 4.3

Я работал над датчиком приближения в S4. После обновления до 4.3 мое приложение начало падать.

Вот пример кода:

Этот метод написан в классе обслуживания

public void playSong(int songIndex) {
    // Play song
    try {
        Log.d("Debug","playSong 1");
        mp.reset();

        Log.d("Debug","playSong 2");
        mp.setDataSource(songsListingSD.get(songIndex).get("songPath"));

        Log.d("Debug","playSong 3");
        mp.prepare();

        Log.d("Debug","playSong 4");
        mp.start();

        // Displaying Song title
        Log.d("Debug","playSong 5");
        String songTitle = songsListingSD.get(songIndex).get("songTitle");
        Log.d("Debug","playSong songTitle = " + songTitle);
        Log.d("Debug","playSong 6");
        songTitleLabel.get().setText(songTitle);
        Log.d("Debug","playSong 7");
        // Changing Button Image to pause image
        btnPlay.get().setImageResource(R.drawable.ic_media_pause); // :351
        Log.d("Debug","playSong 8");
        // set Progress bar values
        songProgressBar.get().setProgress(0);
        songProgressBar.get().setMax(100);
        // Updating progress bar
        updateProgressBar();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я реализовал класс службы с интерфейсом SensorEventListener и реализовал абстрактный метод.

Вот код:

         public void onSensorChanged(SensorEvent event) {
      // TODO Auto-generated method stub
       Log.d("Player Service", "service called for sensor event, Next called1");
    try{
          Log.d("Debug"," check Here");

         Random rand = new Random();
      Log.d("Debug","sensor method 1");
      currentSongIndex = rand
            . nextInt((songsListingSD.size() - 1) - 0 + 1) + 0;
    Log.d("Debug","sensor method 2");
    Log.d("Debug"," Cur Index = " + currentSongIndex);
    playSong(currentSongIndex);
    Log.d("Debug","sensor method 3");
    }
    catch(Exception e){e.printStackTrace();}
 }
 public void onAccuracyChanged(Sensor sensor, int accuracy) {
 }

Это трассировка стека:

10-29 01:09:29.546: D/Player Service(19444): service called for sensor event, Next called1
10-29 01:09:29.546: D/Debug(19444):  check Here
10-29 01:09:29.546: D/Debug(19444): sensor method 1
10-29 01:09:29.546: D/Debug(19444): sensor method 2
10-29 01:09:29.546: D/Debug(19444):  Cur Index = 2
10-29 01:09:29.546: D/Debug(19444): playSong 1
10-29 01:09:29.546: D/Debug(19444): playSong 2
10-29 01:09:29.576: D/Debug(19444): playSong 3
10-29 01:09:29.585: D/Debug(19444): playSong 4
10-29 01:09:29.596: D/Debug(19444): playSong 5
10-29 01:09:29.596: D/Debug(19444): playSong songTitle = [SongsPK.info] Aashiqui 2 - 01 -   Tum Hi Ho
10-29 01:09:29.596: D/Debug(19444): playSong 6
10-29 01:09:29.596: W/System.err(19444): java.lang.NullPointerException
10-29 01:09:29.596: W/System.err(19444):    at         com.example.audionplayerinservice.PlayerService.playSong(PlayerService.java:351)
10-29 01:09:29.606: W/System.err(19444):    at   com.example.audionplayerinservice.PlayerService.onSensorChanged(PlayerService.java:589)
10-29 01:09:29.606: W/System.err(19444):    at android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:371)
10-29 01:09:29.606: W/System.err(19444):    at android.os.MessageQueue.nativePollOnce(Native Method)
10-29 01:09:29.606: W/System.err(19444):    at android.os.MessageQueue.next(MessageQueue.java:132)
10-29 01:09:29.606: W/System.err(19444):    at android.os.Looper.loop(Looper.java:124)
10-29 01:09:29.606: W/System.err(19444):    at android.app.ActivityThread.main(ActivityThread.java:5103)
10-29 01:09:29.606: W/System.err(19444):    at java.lang.reflect.Method.invokeNative(Native Method)
10-29 01:09:29.606: W/System.err(19444):    at java.lang.reflect.Method.invoke(Method.java:525)
10-29 01:09:29.606: W/System.err(19444):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-29 01:09:29.606: W/System.err(19444):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-29 01:09:29.616: W/System.err(19444):    at dalvik.system.NativeStart.main(Native Method) 

Код для регистрации прослушивателя близости:

    private WeakReference<ImageView> btnPlay
    private WeakReference<TextView> songTitleLabel;
    private SensorManager mSensorManager;
private Sensor mSensor;

    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_NORMAL );

Я тестирую это в эмуляторе 4.3 (Android). Если я прокомментирую сенсорную часть, то приложение работает. Пожалуйста, помогите мне в отладке, так как я не могу найти никакой ошибки. Заранее спасибо


person Jeet    schedule 29.10.2013    source источник
comment
что такое переменная btnPlay?   -  person Gopal Gopi    schedule 29.10.2013
comment
weakRef изображения, изображение есть, и я сказал, что тот же код работает, если я просто отключу сенсорную часть   -  person Jeet    schedule 29.10.2013
comment
я думаю, что это не проблема, связанная с датчиком, поскольку исключение составляет функция playSong.   -  person Ali Imran    schedule 29.10.2013
comment
Но тогда Y работает правильно, когда я отключаю сенсорную часть. Более того, U может видеть стек, в котором я получаю значение, и изображение также присутствует там. Является ли эта проблема причиной ограниченного профиля? Я вообще не знаю о закрытом профиле   -  person Jeet    schedule 29.10.2013


Ответы (1)


см. документацию по WeakReference.
Нет гарантии, что метод WeakReference get() всегда возвращает ImageView. когда система вызывает сборщик мусора, ImageView в WeakReference может быть очищен, так как ImageView имеет WeakReference. когда ImageView собирает мусор, метод get() возвращает просто null.
Так что сделайте нулевую проверку, как

     ImageView imageView = btnPlay.get();
     if(imageView != bull) {
        imageView.setImageResource(R.drawable.ic_media_pause);
     }
person Gopal Gopi    schedule 29.10.2013
comment
Я проверил, там он становится нулевым, но у? Какая-то конкретная причина? Тот же код работает с Android 4.1.2, 4.2.2. При тестировании на 4.3 я получаю эту ошибку. Любой способ решить это? И все же он работает, когда я отключаю сенсорную часть? любое объяснение? - person Jeet; 29.10.2013
comment
это зависит исключительно от реализации машины Dalvik. от последнего андроида DVM очень эффективен, и у WeakReferences меньше шансов удержать свой объект... - person Gopal Gopi; 29.10.2013
comment
Но если это была проблема с этим, то он не должен работать, когда я отключаю сенсорную часть.... - person Jeet; 29.10.2013
comment
Мы не можем сказать, когда слабая ссылка является сборщиком мусора... так что ищите другие альтернативы... - person Gopal Gopi; 29.10.2013
comment
класс обслуживания, в Activity присутствуют все объекты. Я имею в виду основные объекты деятельности. - person Jeet; 29.10.2013
comment
тогда зачем идти на WeakReferences? попробуйте установить связь между Activity и Service с помощью ServiceConnectionListener - person Gopal Gopi; 29.10.2013
comment
давайте продолжим это обсуждение в чате - person Jeet; 29.10.2013