- 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/
使用Suitecrm 7.9.1 每当我尝试创建销售线索时(即提交创建销售线索表格后),我都会遇到以下错误。 每当我尝试导入csv文件时,都会遇到相同的错误。仅在实时服务器上发生此错误 Fatal e
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
我想在QNX上运行GoogleTestLibrary吗? 但是我收到此错误消息? ldd:FATAL: Could not load library libgtest.so.0 首先,我使用make命
尝试编译代码时,IDE 中显示的 fatal error 和非 fatal error 之间的主要区别是什么? 在这两种情况下,编译器都会显示一条错误消息,并且不会编译程序。 fatal error
当一个人试图编译代码时,在 IDE 中显示的 fatal error 和非 fatal error 之间的主要区别是什么? 在这两种情况下,编译器都会显示一条错误消息,并且程序不会被编译。 fatal
这个程序发出app: 2015/10/24 11:28:15 example.go:22: open some-crazy-non-existent-file: no such file or dir
因此,我正在从事一个项目,但是由于不断收到错误和警告,所以我遇到了一个问题。我对PHP还是很陌生,所以要保持柔和。使用PHP 5.5可以正常运行该程序。但是,当我在PHP 5.6中运行该程序时,会收到
在 WiX 安装程序中 - 如何自定义或覆盖 fatal error 对话框 ()?我想显示详细的错误消息而不是默认设置失败消息。 选项: 是否可以在 WiX 中调整 fatal error 对话框的
我正在尝试通过 Android 工具 > 重命名应用程序包 在 eclipse 中重命名我的 android 应用程序包。它正在生成错误说 A Fatal error occurred while p
我正在使用 Ubuntu 13.10 x64,我正在做一些开发人员正在使用 Windows 的项目,我最近将 git config core.eol 更改为“lf”和 core .autocrlf 为
嗯..世界上的每个服务都可以连接到我的动物园管理员,除了 kafka。下面是我在 server.properties 文件中的连接字符串 zk.connect=1.dzk.syd.druid.neo.
我正在 Java EE 7 中尝试一些东西,我已经构建了一个示例应用程序,可以在此处找到 https://github.com/kenparker/moviplex7.git . 在此过程中,我了解到
我正在尝试使用 bitbucket 中的 ssh 克隆我的存储库,但是每当我克隆存储库时,我都会得到: Connection to bitbucket.org closed by remote hos
该代码包括从一系列数字创建一个数组,以及第三个参数,其中它指示数字的步长,如果它的步长为 2,例如它来自 [1,3, 5] 代码工作正常,除非我以负数作为参数传递 step,例如NumberRange
我正在尝试在我的 ubuntu 中运行一个简单的 git pull 命令。直到几天前,它还可以完美地工作。不是它显示致命:无法访问“https://xxxxxx@bitbucket.org/repon
我知道已经有人问过类似的问题。 但是,我认为我的问题是由于我之前犯的一个错误,因此有所不同:让我解释一下。 一切都如我所愿顺利进行: git add . 我本地存储库中的所有文件。 git commi
我在尝试执行 Jenkins 作业时看到错误。 git 版本 1.8.3.1 Jenkins 2.46.2.1-滚动 我尝试将 git 升级到更高版本,但仍然通过关注 How to install l
Image of the output in the browser 我正在离线处理一个项目。我有一个名为 index.php 的文件。 现在我想在可以编辑的浏览器 sp 中启动。 但是当我尝试通过
我正在AWS的Linux机器上运行RServer Studio。 我尝试安装ModelMetrics的依赖项caret,并收到此错误: auc_.cpp:2:10: fatal error: omp.
我似乎没有重复发帖,所以这是详细信息... 当我使用 XOM(XML 对象模型,Java 库)中的非静态方法 Builder.build() 解析文档时,在 Eclipse 控制台中我得到: [Fat
我是一名优秀的程序员,十分优秀!