再び致命的な例外[閉じました]
-
21-12-2019 - |
質問
この私のlogcat
MediaPlayer(5424): Uri is content://media/external/audio/media/2325
MediaPlayer(5424): http youtube = false, scheme = content
MediaPlayer(5424): Uri is content://media/internal/audio/media/2325
MediaPlayer(5424): http youtube = false, scheme = content
MediaPlayer(5424): Couldn't open file on client side, trying server side
MediaPlayer(5424): attachNewPlayer called in state 2
MUSIC SERVICE(5424): Error setting data source
MUSIC SERVICE(5424): java.lang.IllegalStateException
MUSIC SERVICE(5424): at android.media.MediaPlayer._setDataSource(Native Method)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:981)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:966)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:878)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:812)
MUSIC SERVICE(5424): at com.playmusic.ghufron.MusicService.playSong(MusicService.java:109)
MUSIC SERVICE(5424): at com.playmusic.ghufron.MainActivity.songPicked(MainActivity.java:105)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invokeNative(Native Method)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invoke(Method.java:511)
MUSIC SERVICE(5424): at android.view.View$1.onClick(View.java:3052)
MUSIC SERVICE(5424): at android.view.View.performClick(View.java:3528)
MUSIC SERVICE(5424): at android.view.View$PerformClick.run(View.java:14235)
MUSIC SERVICE(5424): at android.os.Handler.handleCallback(Handler.java:605)
MUSIC SERVICE(5424): at android.os.Handler.dispatchMessage(Handler.java:92)
MUSIC SERVICE(5424): at android.os.Looper.loop(Looper.java:137)
MUSIC SERVICE(5424): at android.app.ActivityThread.main(ActivityThread.java:4424)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invokeNative(Native Method)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invoke(Method.java:511)
MUSIC SERVICE(5424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
MUSIC SERVICE(5424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
MUSIC SERVICE(5424): at dalvik.system.NativeStart.main(Native Method)
dalvikvm(5424): threadid=1: thread exiting with uncaught exception (group=0x40af89f0)
AndroidRuntime(5424): FATAL EXCEPTION: main
AndroidRuntime(5424): java.lang.NoSuchMethodError: android.app.Notification$Builder.build
AndroidRuntime(5424): at com.playmusic.ghufron.MusicService.onPrepared(MusicService.java:156)
AndroidRuntime(5424): at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1758)
AndroidRuntime(5424): at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(5424): at android.os.Looper.loop(Looper.java:137)
AndroidRuntime(5424): at android.app.ActivityThread.main(ActivityThread.java:4424)
AndroidRuntime(5424): at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(5424): at java.lang.reflect.Method.invoke(Method.java:511)
AndroidRuntime(5424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
AndroidRuntime(5424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
AndroidRuntime(5424): at dalvik.system.NativeStart.main(Native Method)
dalvikvm(5653): VFY: unable to resolve virtual method 163: Landroid/app/Notification$Builder;.build ()Landroid/app/Notification;
ここで私の主な活動java
package com.playmusic.ghufron; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import com.playmusic.ghufron.MusicService.MusicBinder; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.database.Cursor; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.MediaController.MediaPlayerControl; public class MainActivity extends Activity implements MediaPlayerControl { //song list variables private ArrayList<Song> songList; private ListView songView; //service private MusicService musicSrv; private Intent playIntent; //binding private boolean musicBound=false; //controller private MusicController controller; //activity and playback pause flags private boolean paused=false, playbackPaused=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //retrieve list view songView = (ListView)findViewById(R.id.song_list); //instantiate list songList = new ArrayList<Song>(); //get songs from device getSongList(); //sort alphabetically by title Collections.sort(songList, new Comparator<Song>(){ public int compare(Song a, Song b){ return a.getTitle().compareTo(b.getTitle()); } }); //create and set adapter SongAdapter songAdt = new SongAdapter(this, songList); songView.setAdapter(songAdt); //setup controller setController(); } //connect to the service private ServiceConnection musicConnection = new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { MusicBinder binder = (MusicBinder)service; //get service musicSrv = binder.getService(); //pass list musicSrv.setList(songList); musicBound = true; } @Override public void onServiceDisconnected(ComponentName name) { musicBound = false; } }; //start and bind the service when the activity starts @Override protected void onStart() { super.onStart(); if(playIntent==null){ playIntent = new Intent(this, MusicService.class); bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); startService(playIntent); } } //user song select public void songPicked(View view){ musicSrv.setSong(Integer.parseInt(view.getTag().toString())); musicSrv.playSong(); if(playbackPaused){ setController(); playbackPaused=false; } controller.show(0); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { //menu item selected switch (item.getItemId()) { case R.id.action_shuffle: musicSrv.setShuffle(); break; case R.id.action_end: stopService(playIntent); musicSrv=null; System.exit(0); break; } return super.onOptionsItemSelected(item); } //method to retrieve song info from device public void getSongList(){ //query external audio ContentResolver musicResolver = getContentResolver(); Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); //iterate over results if valid if(musicCursor!=null && musicCursor.moveToFirst()){ //get columns int titleColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media._ID); int artistColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ARTIST); //add songs to list do { long thisId = musicCursor.getLong(idColumn); String thisTitle = musicCursor.getString(titleColumn); String thisArtist = musicCursor.getString(artistColumn); songList.add(new Song(thisId, thisTitle, thisArtist)); } while (musicCursor.moveToNext()); } } @Override public boolean canPause() { return true; } @Override public boolean canSeekBackward() { return true; } @Override public boolean canSeekForward() { return true; } @Override public int getAudioSessionId() { return 0; } @Override public int getBufferPercentage() { return 0; } @Override public int getCurrentPosition() { if(musicSrv!=null && musicBound && musicSrv.isPng()) return musicSrv.getPosn(); else return 0; } @Override public int getDuration() { if(musicSrv!=null && musicBound && musicSrv.isPng()) return musicSrv.getDur(); else return 0; } @Override public boolean isPlaying() { if(musicSrv!=null && musicBound) return musicSrv.isPng(); return false; } @Override public void pause() { playbackPaused=true; musicSrv.pausePlayer(); } @Override public void seekTo(int pos) { musicSrv.seek(pos); } @Override public void start() { musicSrv.go(); } //set the controller up private void setController(){ controller = new MusicController(this); //set previous and next button listeners controller.setPrevNextListeners(new View.OnClickListener() { @Override public void onClick(View v) { playNext(); } }, new View.OnClickListener() { @Override public void onClick(View v) { playPrev(); } }); //set and show controller.setMediaPlayer(this); controller.setAnchorView(findViewById(R.id.song_list)); controller.setEnabled(true); } private void playNext(){ musicSrv.playNext(); if(playbackPaused){ setController(); playbackPaused=false; } controller.show(0); } private void playPrev(){ musicSrv.playPrev(); if(playbackPaused){ setController(); playbackPaused=false; } controller.show(0); } @Override protected void onPause(){ super.onPause(); paused=true; } @Override protected void onResume(){ super.onResume(); if(paused){ setController(); paused=false; } } @Override protected void onStop() { controller.hide(); super.onStop(); } @Override protected void onDestroy() { stopService(playIntent); musicSrv=null; super.onDestroy(); } }
2.ここで私の音楽サービス
package com.playmusic.ghufron;
import java.util.ArrayList;
import java.util.Random;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentUris;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;
public class MusicService extends Service implements
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
MediaPlayer.OnCompletionListener {
//media player
private MediaPlayer player;
//song list
private ArrayList<Song> songs;
//current position
private int songPosn;
//binder
private final IBinder musicBind = new MusicBinder();
//title of current song
private String songTitle="";
//notification id
private static final int NOTIFY_ID=1;
//shuffle flag and random
private boolean shuffle=false;
private Random rand;
public void onCreate(){
//create the service
super.onCreate();
//initialize position
songPosn=0;
//random
rand=new Random();
//create player
player = new MediaPlayer();
//initialize
initMusicPlayer();
}
public void initMusicPlayer(){
//set player properties
player.setWakeMode(getApplicationContext(),
PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
//set listeners
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
}
//pass song list
public void setList(ArrayList<Song> theSongs){
songs=theSongs;
}
//binder
public class MusicBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
//activity will bind to service
@Override
public IBinder onBind(Intent intent) {
return musicBind;
}
//release resources when unbind
@Override
public boolean onUnbind(Intent intent){
player.stop();
player.release();
return false;
}
//play a song
public void playSong(){
//play
player.reset();
//get song
Song playSong = songs.get(songPosn);
//get title
songTitle=playSong.getTitle();
//get id
long currSong = playSong.getID();
//set uri
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
currSong);
Uri trackUri2 = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI,currSong);
//set the data source
try{
player.setDataSource(getApplicationContext(), trackUri);
player.setDataSource(getApplicationContext(),trackUri2);
}
catch(Exception e){
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
player.prepareAsync();
}
//set the song
public void setSong(int songIndex){
songPosn=songIndex;
}
@Override
public void onCompletion(MediaPlayer mp) {
//check if playback has reached the end of a track
if(player.getCurrentPosition()>0){
mp.reset();
playNext();
}
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.v("MUSIC PLAYER", "Playback Error");
mp.reset();
return false;
}
@Override
public void onPrepared(MediaPlayer mp) {
//start playback
mp.start();
//notification
Intent notIntent = new Intent(this, MainActivity.class);
notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendInt = PendingIntent.getActivity(this, 0,
notIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(this);
builder.setContentIntent(pendInt)
.setSmallIcon(R.drawable.play)
.setTicker(songTitle)
.setOngoing(true)
.setContentTitle("Playing")
.setContentText(songTitle);
Notification ya= builder.build();
startForeground(NOTIFY_ID, ya);
}
//playback methods
public int getPosn(){
return player.getCurrentPosition();
}
public int getDur(){
return player.getDuration();
}
public boolean isPng(){
return player.isPlaying();
}
public void pausePlayer(){
player.pause();
}
public void seek(int posn){
player.seekTo(posn);
}
public void go(){
player.start();
}
//skip to previous track
public void playPrev(){
songPosn--;
if(songPosn<0) songPosn=songs.size()-1;
playSong();
}
//skip to next
public void playNext(){
if(shuffle){
int newSong = songPosn;
while(newSong==songPosn){
newSong=rand.nextInt(songs.size());
}
songPosn=newSong;
}
else{
songPosn++;
if(songPosn>=songs.size()) songPosn=0;
}
playSong();
}
@Override
public void onDestroy() {
stopForeground(true);
}
//toggle shuffle
public void setShuffle(){
if(shuffle) shuffle=false;
else shuffle=true;
}
}
3.ここに私のマニフェスト
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.playmusic.ghufron.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.playmusic.ghufron.MusicService"/>
</application>
</manifest>
これは私のmain_activityです。xml
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000"
android:baselineAligned="true"
android:orientation="vertical"
tools:context=".MainActivity" >
<!-- song list -->
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000000"
android:gravity="right" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/Noads" />
</LinearLayout>
<ListView
android:id="@+id/song_list"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3.29"
android:longClickable="true" >
</ListView>
</LinearLayout>
ここで私の歌のアダプタ
package com.playmusic.ghufron;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class SongAdapter extends BaseAdapter {
//song list and layout
private ArrayList<Song> songs;
private LayoutInflater songInf;
//constructor
public SongAdapter(Context c, ArrayList<Song> theSongs){
songs=theSongs;
songInf=LayoutInflater.from(c);
}
@Override
public int getCount() {
return songs.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//map to song layout
LinearLayout songLay = (LinearLayout)songInf.inflate
(R.layout.song, parent, false);
//get title and artist views
TextView songView = (TextView)songLay.findViewById(R.id.song_title);
TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
//get song using position
Song currSong = songs.get(position);
//get title and artist strings
songView.setText(currSong.getTitle());
artistView.setText(currSong.getArtist());
//set position as tag
songLay.setTag(position);
return songLay;
}
}
説明する:私のアプリは正常に動作していますが、リストビューをクリックするとクラッシュしましたが、音楽は再生され、okをクリックすると停止します!!!
解決
ザ- ビルド() メソッドはAPIレベル16(Android4.1)で追加されました。古いバージョンのAndroidでコードを実行しようとしている可能性があります。
ザ- getNotification() メソッドはapiレベル16から非推奨になりましたが、古いAPIレベル>=11で使用するのは問題ありません。
メモ:全体 通知。ビルダー クラスはAPIレベル11(Honeycomb)で追加されたため、アプリの最小必要なAPIレベルは少なくとも11であると想定しています。
問題を解決するには、次のコードを使用できます。
Notification ya =
(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) ?
builder.build() : builder.getNotification();
所属していません StackOverflow