【问题标题】:Starting a Service throws an IllegalAccessException启动服务会引发 IllegalAccessException
【发布时间】:2011-11-26 16:58:11
【问题描述】:

我有一个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。
  • 是的,我有一些说无法启动服务 IllegalAccessException
  • DEBUG/dalvikvm(12):新实例失败:Lunjustentertainment/com/MusicService; Landroid/app/ActivityThread 无法访问; .086: DEBUG/AndroidRuntime(1252): 关闭 VM 11-26 12:07:46.086: WARN/dalvikvm(1252): threadid=1: thread exiting with unaught exception (group=0x4001d800) 12:07:46.137: ERROR /AndroidRuntime(1252): 致命异常: main 12:07:46.137: 错误/AndroidRuntime(1252): java.lang.RuntimeException: 无法实例化服务 unjustentertainment.com.MusicService: java.lang.IllegalAccessException: 不允许访问类11-26 12:07:46.137: 错误/AndroidRuntime(1252):
  • 将堆栈跟踪添加到问题中。

标签: android android-intent android-service media-player


【解决方案1】:

您得到的异常是因为系统无法初始化您的服务(调用其构造函数),因为它不可访问。

正如它所说的here

...确保课程是 公开...

您发布的课程未公开,因此请公开。

【讨论】:

  • 这是一个好主意,现在我在 11-26 12:31:30.336: ERROR/AndroidRuntime(1893): java.lang.RuntimeException: Unable to start service unjustentertainment.com.MusicService @44e83d70 与 Intent { cmp=unjustentertainment.com/.MusicService }: java.lang.NullPointerException
  • 提供完整的堆栈跟踪,NullPointerExeption 来自哪里?
  • INFO/ActivityManager(59): 为服务 unjustentertainment.com/.MusicService 启动 proc unjustentertainment.com: pid=1893 uid=10036 gids={1015} 2:31:30.286: DEBUG/AndroidRuntime( 1893):关闭 VM 12:31:30.286:WARN/dalvikvm(1893):threadid=1:线程退出但未捕获异常(组=0x4001d800) 12:31:30.336:错误/AndroidRuntime(1893):致命异常:主要12:31:30.336:错误/AndroidRuntime(1893):java.lang.RuntimeException:无法使用 Intent { cmp=unjustentertainment.com/.MusicService } 启动服务 unjustentertainment.com.MusicService@44e83d70:java.lang.NullPointerException跨度>
  • 我现在明白了,我只是不明白为什么我的音乐无法开始播放
【解决方案2】:

您需要公开您的课程。 即

 public class MusicService extends Service implements OnCompletionListener {
          MediaPlayer mediaPlayer;
           String musicFile;

【讨论】:

  • 在上面的答案中检查我的 cmets
  • 您提供的堆栈跟踪是部分的。请提供完整的堆栈跟踪。不要把它放在评论中(那里没有足够的空间)。编辑您的原始帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
相关资源
最近更新 更多