在Android 4.3中使用接近传感器
我当时正在研究S4中的接近传感器。更新到4.3后,我的应用程序开始崩溃 以下是代码示例: 此方法是在服务类中编写的在Android 4.3中使用接近传感器,android,android-4.3-jelly-bean,proximitysensor,Android,Android 4.3 Jelly Bean,Proximitysensor,我当时正在研究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(songsLi
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 );
private WeakReference btnPlay
私人WeakReference songTitleLabel;
私人传感器管理器;
专用传感器;
msSensorManager=(SensorManager)getSystemService(传感器服务);
mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_接近度);
mSensorManager.registerListener(此,mSensor,SensorManager.SENSOR\u延迟\u正常);
我正在emulator 4.3(Android)中对此进行测试。如果我评论了传感器部分,则应用程序正在工作。
请帮我调试,因为我找不到任何错误。
提前感谢有关详细信息,请参阅文档不能保证
WeakReference
get()方法总是返回ImageView
。当系统调用垃圾收集器时,可以清除WeakReference中的ImageView,因为ImageView具有WeakReference。当ImageView进行垃圾收集时,get()方法只返回null
所以要执行空检查,比如
ImageView imageView = btnPlay.get();
if(imageView != bull) {
imageView.setImageResource(R.drawable.ic_media_pause);
}
什么是btnPlay变量?imageview的weakRef,image在那里,我说如果我只是禁用传感器部分,那么相同的代码也在工作。我认为这不是传感器相关的问题,因为playSong函数存在异常。但是,当我禁用传感器部分时,它工作正常。更多关于你可以看到堆栈,我得到的值和图像也存在那里。此问题是否是限制配置文件的原因?我不知道allI的受限配置文件检查过了,它在那里变为空,但是y?有什么具体原因吗?同样的代码也适用于android 4.1.2、4.2.2。在4.3上测试时,我遇到了这个错误。有办法解决这个问题吗?当我禁用传感器部件时,它仍然工作吗?有什么解释吗?这完全取决于Dalvik机器的实现。从最新的安卓系统来看,DVM非常有效,WeakReferences持有其对象的机会较少……但如果它有问题,那么当我禁用传感器部分时,它不应该运行……我们不能说弱引用何时被垃圾收集。。。因此,选择其他替代方案…服务类,在活动中,所有对象都存在。我引用的是主要的活动对象。。