启动服务时抛出了IllegalAccessException异常

6
我有一个Service,它接收音频文件并使用MediaPlayer播放。这是我调用Service的方式:
private void playAudio(String url) throws Exception {
    Intent music = new Intent(this,MusicService.class);
    music.putExtra("paths", path);
    startService(music);
}

这是我的Service类:
class MusicService extends Service implements OnCompletionListener {
    MediaPlayer mediaPlayer;
    String musicFile;

    @Override
    public void onCreate() {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(this);
        Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_LONG).show();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Bundle e = intent.getExtras();
        musicFile= e.getString("paths"); 
        try {
            mediaPlayer.prepare(); 
            mediaPlayer.setDataSource(musicFile);
        } catch (IllegalArgumentException i) {
            // TODO Auto-generated catch block
            i.printStackTrace();
        } catch (IllegalStateException i) {
            // TODO Auto-generated catch block
            i.printStackTrace();
        } catch (IOException i) {
            // TODO Auto-generated catch block
            i.printStackTrace();
        }
        if (!mediaPlayer.isPlaying()) {             
            mediaPlayer.start();             
        } 
        return START_STICKY; 
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
}

Service 没有被执行,Toast 没有显示,MediaPlayer 没有播放。

我在清单文件中声明了它:

<service android:name=".MusicService" android:enabled="true"></service>

我遇到一个强制关闭的错误,我的日志中显示了 IllegalAccessException

java.lang.RuntimeException: Unable to instantiate service unjustentertainment.com.MusicService:
    java.lang.IllegalAccessException: access to class not allowed

你是否收到异常?如果你遇到了无法理解的异常,请查看DDMS/LogCat并在此处发布。 - Asher
是的,我得到了一些错误提示,说无法启动服务IllegalAccessException。 - Waggoner_Keith
调试/dalvikvm(12): newInstance失败:Lunjustentertainment/com/MusicService;不可访问Landroid/app/ActivityThread; .086: 调试/AndroidRuntime(1252): 关闭VM 11-26 12:07:46.086: 警告/dalvikvm(1252): 线程ID=1:线程退出时出现未捕获的异常(组=0x4001d800) 12:07:46.137: 错误/AndroidRuntime(1252): 致命异常:主要原因是无法实例化服务unjustentertainment.com.MusicService:java.lang.IllegalAccessException:不允许访问类 11-26 12:07:46.137: 错误/AndroidRuntime(1252): - Waggoner_Keith
将堆栈跟踪添加到问题中。 - Asher
2个回答

13
你得到的异常是因为系统无法初始化你的服务(调用其构造函数),因为它不可访问。
正如这里所说:

...确保该类被声明为公共类...

你发布的类不是公共类,所以请将其设为公共类。

这是一个好主意,现在我遇到了这个错误:11-26 12:31:30.336: ERROR/AndroidRuntime(1893): java.lang.RuntimeException: Unable to start service unjustentertainment.com.MusicService@44e83d70 with Intent { cmp=unjustentertainment.com/.MusicService }: java.lang.NullPointerException - Waggoner_Keith
提供完整的堆栈跟踪,空指针异常是从哪里来的? - Asher
INFO/ActivityManager(59): 启动进程 unjustentertainment.com,用于服务 unjustentertainment.com/.MusicService: pid=1893 uid=10036 gids={1015} 2:31:30.286: DEBUG/AndroidRuntime(1893): 关闭虚拟机 12:31:30.286: WARN/dalvikvm(1893): 线程id=1: 线程退出时出现未捕获的异常 (group=0x4001d800) 12:31:30.336: ERROR/AndroidRuntime(1893): 致命异常: 主线程 12:31:30.336: ERROR/AndroidRuntime(1893): java.lang.RuntimeException: 无法启动服务 unjustentertainment.com.MusicService@44e83d70,使用 Intent { cmp=unjustentertainment.com/.MusicService }: java.lang.NullPointerException - Waggoner_Keith
我现在已经弄清楚了,只是不明白为什么我的音乐不会开始播放。 - Waggoner_Keith

2
你需要将你的类设为公共类。 例如:
 public class MusicService extends Service implements OnCompletionListener {
          MediaPlayer mediaPlayer;
           String musicFile;

请查看我对上面答案的评论。 - Waggoner_Keith
您提供的堆栈跟踪是部分的。请提供完整的堆栈跟踪。不要将其放在评论中(那里没有足够的空间)。请编辑您的原始帖子。 - Asher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接