- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,可以在按下按钮时播放声音。
我试图强制 MediaPlayer 在来电时静音,然后以正常音量继续(在空闲模式下)。
我编写了下面的代码来完成此操作,尽管它在下一行的 NullPointerException 下崩溃了。
if (mp.isPlaying() && state == TelephonyManager.CALL_STATE_RINGING) {
因为
mp.isPlaying()
任何人都可以确定为什么会发生这种情况吗?后来在我的代码中我引用 mp 来播放声音。
// Release any resources from previous MediaPlayer
if (mp != null) {
mp.release();
}
// Create a new MediaPlayer to play this sound
mp = MediaPlayer.create(this, resId);
mp.setLooping(true);
mp.start();
这是我的待命静音和空闲恢复代码。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (mp.isPlaying() && state == TelephonyManager.CALL_STATE_RINGING) {
mp.setVolume(0,0);
} else if(mp.isPlaying() && state == TelephonyManager.CALL_STATE_IDLE) {
mp.setVolume(1,1);
} else if(mp.isPlaying() && state == TelephonyManager.CALL_STATE_OFFHOOK) {
mp.setVolume(0,0);
}
super.onCallStateChanged(state, incomingNumber);
}
};
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
如果稍后在应用程序中调用 mp,我无法理解为什么 mp 为 Null。如果不播放会返回 null 吗?如果是这样,我将如何解决这个问题。
这是我按照要求进行的全部 Activity 。
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnClickListener{
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (mp.isPlaying() && state == TelephonyManager.CALL_STATE_RINGING) {
mp.setVolume(0,0);
} else if(mp.isPlaying() && state == TelephonyManager.CALL_STATE_IDLE) {
mp.setVolume(1,1);
} else if(mp.isPlaying() && state == TelephonyManager.CALL_STATE_OFFHOOK) {
mp.setVolume(0,0);
}
super.onCallStateChanged(state, incomingNumber);
}
};
TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Button button1=(Button)findViewById(R.id.button_1);
Button button2=(Button)findViewById(R.id.button_2);
Button button3=(Button)findViewById(R.id.button_3);
Button button4=(Button)findViewById(R.id.button_4);
Button button5=(Button)findViewById(R.id.button_5);
Button button6=(Button)findViewById(R.id.button_6);
Button button7=(Button)findViewById(R.id.button_7);
Button button8=(Button)findViewById(R.id.button_8);
final ImageView button_stop=(ImageView)findViewById(R.id.button_stop);
ImageView button_rate=(ImageView)findViewById(R.id.button_rate);
ImageView button_exit=(ImageView)findViewById(R.id.button_exit);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
button5.setOnClickListener(this);
button6.setOnClickListener(this);
button7.setOnClickListener(this);
button8.setOnClickListener(this);
button_stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(null!=mp){
mp.release();
button_stop.setImageResource(R.drawable.ic_action_volume_muted);
}
}});
button_exit.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(0);
finish();
}});
button_rate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String str ="https://play.google.com/store/apps/details?id=example";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(str)));
}
;{
}});
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("example")
.setContentText("example.");
// Creates an explicit intent for an Activity in your app
final Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mBuilder.setOngoing(true);
// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
// Adds the back stack for the Intent (but not the Intent itself)
PendingIntent resultPendingIntent = PendingIntent.getActivity(this,0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int mId = 0;
// mId allows you to update the notification later on.
mNotificationManager.notify(mId, mBuilder.build());
}
public void onClick(View v) {
int resId;
switch (v.getId()) {
case R.id.button_1:
resId = R.raw.birdsong;
break;
case R.id.button_2:
resId = R.raw.electrifying_thunderstorms;
break;
case R.id.button_3:
resId = R.raw.fan;
break;
case R.id.button_4:
resId = R.raw.jungle_river;
break;
case R.id.button_5:
resId = R.raw.pig_frogs;
break;
case R.id.button_6:
resId = R.raw.predawn;
break;
case R.id.button_7:
resId = R.raw.shower;
break;
case R.id.button_8:
resId = R.raw.twilight;
break;
default:
resId = R.raw.birdsong;
break;
}
// Release any resources from previous MediaPlayer
if (mp != null) {
mp.release();
}
// Create a new MediaPlayer to play this sound
mp = MediaPlayer.create(this, resId);
mp.setLooping(true);
mp.start();
ImageView button_stop=(ImageView)findViewById(R.id.button_stop);
button_stop.setImageResource(R.drawable.ic_action_volume_on);
}{
}
@Override
protected void onDestroy() {
if(null!=mp){
mp.release();
}
super.onDestroy();
}
}
LOGCAT
02-27 12:55:12.306: W/dalvikvm(887): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
02-27 12:55:12.326: E/AndroidRuntime(887): FATAL EXCEPTION: main
02-27 12:55:12.326: E/AndroidRuntime(887): java.lang.NullPointerException
02-27 12:55:12.326: E/AndroidRuntime(887): at me.soundasleep.app.MainActivity$1.onCallStateChanged(MainActivity.java:36)
02-27 12:55:12.326: E/AndroidRuntime(887): at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:369)
02-27 12:55:12.326: E/AndroidRuntime(887): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 12:55:12.326: E/AndroidRuntime(887): at android.os.Looper.loop(Looper.java:137)
02-27 12:55:12.326: E/AndroidRuntime(887): at android.app.ActivityThread.main(ActivityThread.java:5041)
02-27 12:55:12.326: E/AndroidRuntime(887): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 12:55:12.326: E/AndroidRuntime(887): at java.lang.reflect.Method.invoke(Method.java:511)
02-27 12:55:12.326: E/AndroidRuntime(887): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-27 12:55:12.326: E/AndroidRuntime(887): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-27 12:55:12.326: E/AndroidRuntime(887): at dalvik.system.NativeStart.main(Native Method)
02-27 12:55:12.358: W/ActivityManager(292): Force finishing activity me.soundasleep.app/.MainActivity
02-27 12:55:12.366: W/WindowManager(292): Failure taking screenshot for (328x583) to layer 21010
02-27 12:55:12.656: E/SurfaceFlinger(37): ro.sf.lcd_density must be defined as a build property
02-27 12:55:12.886: W/ActivityManager(292): Activity pause timeout for ActivityRecord{4132e3e0 u0 me.soundasleep.app/.MainActivity}
02-27 12:55:13.149: E/SurfaceFlinger(37): ro.sf.lcd_density must be defined as a build property
02-27 12:55:16.186: I/Process(887): Sending signal. PID: 887 SIG: 9
02-27 12:55:16.206: I/ActivityManager(292): Process EXAMPLE (pid 887) has died.
最佳答案
PhoneStateListener()
在创建 MediaPlayer
之前执行,这就是您收到空指针异常的原因。在声明其监听器 phoneStateListener
之前放置以下方法:
mp = MediaPlayer.create(this, resId);
mp.setLooping(true);
mp.start();
PhoneStateListener phoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (mp.isPlaying() && state == TelephonyManager.CALL_STATE_RINGING) {
mp.setVolume(0,0);
} else if(mp.isPlaying() && state == TelephonyManager.CALL_STATE_IDLE) {
mp.setVolume(1,1);
} else if(mp.isPlaying() && state == TelephonyManager.CALL_STATE_OFFHOOK) {
mp.setVolume(0,0);
}
super.onCallStateChanged(state, incomingNumber);
}
};
希望对你有帮助!
关于java - mp.isPlaying() 抛出 Fatal NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22069522/
来自 java docs 公共(public) FileWriter(String fileName) 抛出 IOException 抛出: IOException - 如果指定的文件存在但它是目录而
我使用以下代码将我的 .net 客户端(基于 CQL)连接到 3 节点 Cassandra 集群。我以 30 条记录/秒的速度(从 RabbitMQ)获取数据,并且它们顺利地存储在 cassandra
如果在读取文件时缺少字段,我应该捕获 NoSuchElementException。如果缺少一个字段,我只需要跳到文件的下一行。我的问题是,我在哪里实现我的 try/catch 代码来做到这一点?这是
我正在尝试使用 ASP.NET MVC 实现 OpeinID 登录。我正在尝试按照 http://blog.nerdbank.net/2008/04/add-openid-login-support-
学习使用 Java 进行 xml 解析,并且正在编写一个测试程序来尝试各种东西。所有测试 System.out.println() 都是我在控制台中所期望的,除了 childElement 返回 [n
我正在尝试使用 SwingUtilities 创建 JFrame Thread tt = new Thread(new Runnable() { public void run
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我写了这段代码: MethodInfo method2 = typeof(IntPtr).GetMethod( "op_Explicit", Bind
我开始学习 Java,并且正在根据书本做一些练习。在执行此操作时,我遇到了以下错误:线程“main”java.util.InputMismatchException 中出现异常。我正在编写一个简单的程
我有一个文本文件,其中前两行是整数 m 和 n,然后有 m 行,每行都有 n 管道分隔值。我编写了一个程序,读取文件并使用文件中的值创建 m*n 数组,它工作了无数次,然后突然,使用相同的代码,使用相
所以我尝试使用在另一个类中生成的 bean 以在主应用程序中使用 package com.simon.spring.basics.properties; import org.spri
我还没有完成这个应用程序,但我希望在我的手机上看到它的样子。但是,它会强制关闭并引发 InstantiationException。 logcat 异常: 09-19 20:13:47.987: D/
我想从 UIViewController 加载一个基于 SwiftUI 的 View ,该 View 读取包本地的 json。仅 swiftUI 项目中的代码和绑定(bind)工作正常,当我利用 UI
'java.net.SocketTimeoutException:连接超时' 循环一段时间后我收到此错误。为什么我会收到 SocketTimeoutException?我该如何修复这个错误? @Ove
当有 null 值时抛出 ArgumentNullException() 是个好主意吗? This thread 没有提到在 null 上抛出的最明显的异常。 谢谢 最佳答案 ArgumentNull
我得到这个异常: NullReferenceException Object reference not set to an instance of an object at Namespace
所以其中一个方法的描述如下: public BasicLinkedList addToFront(T data) This operation is invalid for a sorted list
我正在使用 Intellij Idea,当我去生成 JavaDocs(通过工具 -> 生成 JavaDoc)时,我抛出了一个 IllegealArgumentException,没有关于发生了什么问题
我正在学习 C++ 中的互斥锁,但以下代码(摘自 N. Josuttis 的“C++ 标准库”)有问题。 我不明白为什么它会阻塞/抛出除非我在主线程中添加this_thread::sleep_for(
我正在试验 JavaFX 标签和组,通过鼠标拖动将它们移动到屏幕上。新节点从一些线程添加到动画组。但是,有时我会突然看到以下异常 - 我假设,当某些节点重叠时。但是不知道是什么问题……因为不涉及我的代
我是一名优秀的程序员,十分优秀!