java.lang.NullPointerException致命异常:IntentService[GCMinentService-876799952849-1]

java.lang.NullPointerException致命异常:IntentService[GCMinentService-876799952849-1],java,android,android-intent,Java,Android,Android Intent,在将其标记为重复cz之前,请仔细阅读我的问题。我已经仔细搜索了这个案例。我目前正在开发一个android应用程序,通过网站远程控制您的android设备。目前,当我尝试发送启动录音机的命令时,会出现此异常。我已经制作了一个类名为audiorecorder.java,其对象是在消息“startrecorder”时创建的从服务器端到达。此消息实际上在gcminent service.java中进行了比较。我正在粘贴代码段和日志。请帮助我,因为此错误不仅在录音机功能的acse中出现,在其他情况下也会出

在将其标记为重复cz之前,请仔细阅读我的问题。我已经仔细搜索了这个案例。我目前正在开发一个android应用程序,通过网站远程控制您的android设备。目前,当我尝试发送启动录音机的命令时,会出现此异常。我已经制作了一个类名为audiorecorder.java,其对象是在消息“startrecorder”时创建的从服务器端到达。此消息实际上在gcminent service.java中进行了比较。我正在粘贴代码段和日志。请帮助我,因为此错误不仅在录音机功能的acse中出现,在其他情况下也会出现,例如拍摄电影或从相机拍照。 提前准备好

Audiorecorder.java

package com.androidhive.pushnotifications;

import java.io.File;

import java.io.IOException;

import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;

import android.app.Activity;

public class AudioRecorder extends Activity {
    final MediaRecorder recorder = new MediaRecorder();
    public String path;

    public void onCreate(String path) {
        this.path = sanitizePath(path);
    }

    private String sanitizePath(String path) {
        if (!path.startsWith("/")) {
            path = "/" + path;
        }
        if (!path.contains(".")) {
            path += ".3gp";
        }
        return Environment.getExternalStorageDirectory().getAbsolutePath()
                + path;
    }

    public void start() throws IOException {
        String state = android.os.Environment.getExternalStorageState();
        if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
            throw new IOException("SD Card is not mounted.  It is " + state
                    + ".");
        }

        // make sure the directory we plan to store the recording in exists
        File directory = new File(path).getParentFile();
        if (!directory.exists() && !directory.mkdirs()) {
            throw new IOException("Path to file could not be created.");
        }

        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile(path);
        recorder.prepare();
        recorder.start();
    }

    public void stop() throws IOException {
        recorder.stop();
        recorder.release();
    }

    public void playrecording(String path) throws IOException {
        MediaPlayer mp = new MediaPlayer();
        mp.setDataSource(path);
        mp.prepare();
        mp.start();
        mp.setVolume(10, 10);
    }

}   





Gcmintentservice.java --->
 else if(message.equalsIgnoreCase ("startrecorder")){

            AudioRecorder a = new AudioRecorder();
            try {
                a.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }




Logcat:

    11-23 11:36:11.338: D/dalvikvm(2313): GC_EXTERNAL_ALLOC freed 51K, 51% free 2687K/5379K, external 0K/0K, paused 362ms
    11-23 11:36:11.438: D/dalvikvm(2313): GC_EXTERNAL_ALLOC freed 1K, 51% free 2688K/5379K, external 0K/512K, paused 88ms
    11-23 11:36:18.685: V/GCMBroadcastReceiver(2313): onReceive: com.google.android.c2dm.intent.RECEIVE
    11-23 11:36:18.695: V/GCMBroadcastReceiver(2313): GCM IntentService class: com.androidhive.pushnotifications.GCMIntentService
    11-23 11:36:18.695: V/GCMBaseIntentService(2313): Acquiring wakelock
    11-23 11:36:18.735: V/GCMBaseIntentService(2313): Intent service name: GCMIntentService-876799952849-1
    11-23 11:36:18.755: I/GCMIntentService(2313): Received message
    11-23 11:36:18.775: V/GCMBaseIntentService(2313): Releasing wakelock
    11-23 11:36:18.775: W/dalvikvm(2313): threadid=10: thread exiting with uncaught exception (group=0x40018560)
    11-23 11:36:18.785: E/AndroidRuntime(2313): FATAL EXCEPTION: IntentService[GCMIntentService-876799952849-1]
    11-23 11:36:18.785: E/AndroidRuntime(2313): java.lang.NullPointerException
    11-23 11:36:18.785: E/AndroidRuntime(2313): at java.io.File.fixSlashes(File.java:205)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at java.io.File.init(File.java:189)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at java.io.File.<init>(File.java:139)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at com.androidhive.pushnotifications.AudioRecorder.start(AudioRecorder.java:39)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at com.androidhive.pushnotifications.GCMIntentService.onMessage(GCMIntentService.java:128)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at android.os.Handler.dispatchMessage(Handler.java:99)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at android.os.Looper.loop(Looper.java:130)
    11-23 11:36:18.785: E/AndroidRuntime(2313): at android.os.HandlerThread.run(HandlerThread.java:60)
package com.androidhive.pushnotifications;
导入java.io.File;
导入java.io.IOException;
导入android.media.MediaPlayer;
导入android.media.MediaRecorder;
导入android.os.Environment;
导入android.app.Activity;
公共类录音机扩展活动{
最终媒体录制器=新媒体录制器();
公共字符串路径;
创建公共void(字符串路径){
this.path=sanitizePath(路径);
}
专用字符串清理路径(字符串路径){
如果(!path.startsWith(“/”){
path=“/”+路径;
}
如果(!path.contains(“.”){
路径+=“.3gp”;
}
返回Environment.getExternalStorageDirectory().getAbsolutePath()
+路径;
}
public void start()引发IOException{
String state=android.os.Environment.getExternalStorageState();
如果(!state.equals(android.os.Environment.MEDIA_MOUNTED)){
抛出新IOException(“SD卡未装入。它是”+状态
+ ".");
}
//确保我们计划存储录制的目录存在
文件目录=新文件(路径).getParentFile();
如果(!directory.exists()&&!directory.mkdirs()){
抛出新IOException(“无法创建文件路径”);
}
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
setOutputFormat(MediaRecorder.OutputFormat.ThreeGPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(路径);
记录器。准备();
recorder.start();
}
public void stop()引发IOException{
录音机。停止();
记录器。释放();
}
公共void播放录制(字符串路径)引发IOException{
MediaPlayer mp=新的MediaPlayer();
mp.setDataSource(路径);
mp.prepare();
mp.start();
mp.setVolume(10,10);
}
}   
gcminentservice.java--->
else if(message.equalsIgnoreCase(“startrecorder”)){
录音机a=新录音机();
试一试{
a、 start();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
日志:
11-23 11:36:11.338:D/dalvikvm(2313):外部释放51K,51%释放2687K/5379K,外部0K/0K,暂停362ms
11-23 11:36:11.438:D/dalvikvm(2313):GC_外部分配释放1K,51%释放2688K/5379K,外部0K/512K,暂停88ms
11-23 11:36:18.685:V/GCMBroadcastReceiver(2313):onReceive:com.google.android.c2dm.intent.RECEIVE
11-23 11:36:18.695:V/GCMBroadcastReceiver(2313):GCM IntentService类:com.androidhive.pushnotifications.gcminentservice
11-23 11:36:18.695:V/GCMBaseIntentService(2313):获取尾波锁
11-23 11:36:18.735:V/GCMBaseIntentService(2313):意向服务名称:gcminentservice-876799952849-1
11-23 11:36:18.755:I/GCMinentService(2313):收到消息
11-23 11:36:18.775:V/GCMBaseIntentService(2313):释放尾波锁
11-23 11:36:18.775:W/dalvikvm(2313):threadid=10:线程以未捕获异常退出(组=0x40018560)
11-23 11:36:18.785:E/AndroidRuntime(2313):致命异常:IntentService[GCMinentService-876799952849-1]
11-23 11:36:18.785:E/AndroidRuntime(2313):java.lang.NullPointerException
11-23 11:36:18.785:E/AndroidRuntime(2313):在java.io.File.fixSlashes(File.java:205)
11-23 11:36:18.785:E/AndroidRuntime(2313):位于java.io.File.init(File.java:189)
11-23 11:36:18.785:E/AndroidRuntime(2313):位于java.io.File.(File.java:139)
11-23 11:36:18.785:E/AndroidRuntime(2313):在com.androidhive.pushnotifications.AudioRecorder.start(AudioRecorder.java:39)
11-23 11:36:18.785:E/AndroidRuntime(2313):在com.androidhive.pushnotifications.gcminentservice.onMessage(gcminentservice.java:128)
11-23 11:36:18.785:E/AndroidRuntime(2313):在com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
11-23 11:36:18.785:E/AndroidRuntime(2313):在android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
11-23 11:36:18.785:E/AndroidRuntime(2313):在android.os.Handler.dispatchMessage(Handler.java:99)上
11-23 11:36:18.785:E/AndroidRuntime(2313):在android.os.Looper.loop(Looper.java:130)
11-23 11:36:18.785:E/AndroidRuntime(2313):在android.os.HandlerThread.run(HandlerThread.java:60)上

可能您尚未在清单文件中授予唤醒锁定权限:

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

这看起来不对:

public String path;

public void onCreate(String path) {
    this.path = sanitizePath(path);
}
或创建
没有
活动
方法的签名,因此在启动活动时不会执行。因此,
path
保持为空,导致
filedirectory=newfile(path).getParentFile()处出现
NullPointerException


如果您希望将
路径
变量传递给您的活动,则应将其置于启动活动的意图中。

如何初始化
路径
?它仍然会强制关闭应用程序。