电话通话后Android媒体播放器的音量变化问题

时间:2014-01-28 09:47:44

标签: android

我在我的mp3播放器中使用一项服务来播放媒体。我使用mediaplayer对象来播放音乐。通常音量键在播放音乐时起作用。我还在我的服务中使用Telephony Manager来查看电话。当呼叫断开并且正在进行时,我开始和停止音乐。但在断开电话后,音量键停止工作。我可以看到音量变化的对话框。但音量不会改变。任何的想法?它甚至发生在本地玩家身上。

我的播放器服务:

public class PPlayService extends Service {
public static final int NOTIFICATION_NUMBER = 0;
Context conte;
MediaPlayer playHandler;
BroadcastReceiver broadcaster;
IncomingHandler mServiceHandler;
String online = "", link = "", name = "";
boolean playing = false;
boolean currentFlag = true;
Runnable runnable;
String[] uris, names;
int send;
SharedPreferences pre;
NotificationManager notificationManager;
NotificationCompat.Builder mBuilder;
AudioManager am;

// ........
PhoneStateListener phoneStateListener;
TelephonyManager mgr;
boolean notFromTelephone = false;
RemoteViews contentView;
BroadcastReceiver stopFromNoti, forwardFromNoti, backwardFromNoti;
Thread th;

public void handleMessage(Message msg) {
    try {
        playing = false;
        if (playHandler != null) {
            playHandler.setOnPreparedListener(null);
            playHandler.setOnCompletionListener(null);
        }
        currentFlag = true;
        System.gc();
        if (online.equals("0")) {
            contentView = new RemoteViews(getPackageName(),
                    R.layout.offline_notification_layout);
            PendingIntent pit = PendingIntent.getBroadcast(conte, 0,
                    new Intent("stopfromnoti"),
                    PendingIntent.FLAG_UPDATE_CURRENT);
            contentView.setOnClickPendingIntent(R.id.play_or_pause_noti,
                    pit);
            PendingIntent backSong = PendingIntent.getBroadcast(conte, 0,
                    new Intent("backwardFromNoti"),
                    PendingIntent.FLAG_UPDATE_CURRENT);
            contentView.setOnClickPendingIntent(R.id.backward_noti,
                    backSong);
            PendingIntent frontSong = PendingIntent.getBroadcast(conte, 0,
                    new Intent("forwardFromNoti"),
                    PendingIntent.FLAG_UPDATE_CURRENT);
            contentView.setOnClickPendingIntent(R.id.forward_noti,
                    frontSong);
        } else {
            contentView = new RemoteViews(getPackageName(),
                    R.layout.online_notification_layout);
            PendingIntent pit = PendingIntent.getBroadcast(conte, 0,
                    new Intent("stopfromnoti"),
                    PendingIntent.FLAG_UPDATE_CURRENT);
            contentView.setOnClickPendingIntent(R.id.play_or_pause_noti,
                    pit);
        }
        Intent intt = new Intent(getBaseContext(), MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
                intt, 0);
        mBuilder = new NotificationCompat.Builder(conte)
                .setSmallIcon(R.drawable.icon).setContent(contentView)
                .setContentIntent(pi).setAutoCancel(false);
        notificationManager.notify(
                Mp3Constants.NOTIFICATION_NUMBER_FOR_PLAYER,
                mBuilder.build());
        Intent in = new Intent(Mp3Constants.NOTIFICATION);
        in.putExtra("download", "0");
        in.putExtra("online", online);
        in.putExtra("name", name);
        in.putExtra("status", Mp3Constants.LOADING);
        in.putExtra("currentTime", 0);
        in.putExtra("totalTime", 0);
        conte.sendBroadcast(in);
        if (playHandler != null) {
            playing = false;
            playHandler.reset();
        } else {
            playHandler = new MediaPlayer();
        }
        if (online.equals("1")) {
            // Online Stream
            playHandler.setAudioStreamType(AudioManager.STREAM_MUSIC);

            try {
                playHandler.setDataSource(link);
                playHandler.setOnPreparedListener(new OnPreparedListener() {

                    @Override
                    public void onPrepared(MediaPlayer arg0) {
                        if (playHandler != null) {
                            if (!playHandler.isPlaying()) {
                                playSongNow();
                            }
                        }
                    }
                });
                playHandler.prepareAsync();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            // Offline Stream
            playHandler = MediaPlayer.create(conte, Uri.parse(link));
            playSongNow();
        }
    } catch (Exception e) {
    }
}

@Override
public void onCreate() {
    conte = this;
    am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    am.requestAudioFocus(new OnAudioFocusChangeListener() {

        @Override
        public void onAudioFocusChange(int focusChange) {

        }
    }, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
            AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
    forwardFromNoti = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            if (playHandler != null) {
                playHandler.reset();
                playing = false;
            }
            getSD();
            int i = 0;
            for (i = 0; i < send; i++) {
                if (link.equalsIgnoreCase(uris[i])) {
                    break;
                }
            }
            if (i >= send - 1) {
                if (send > 0) {
                    name = names[0];
                    link = uris[0];
                    pre.edit().putString("name", name);
                    pre.edit().putString("online", online);
                    pre.edit().putString("link", link);
                    Message msg = mServiceHandler.obtainMessage();
                    msg.arg1 = 1;
                    mServiceHandler.sendMessage(msg);
                }
            } else {
                name = names[i + 1];
                link = uris[i + 1];
                pre.edit().putString("name", name);
                pre.edit().putString("online", online);
                pre.edit().putString("link", link);
                Message msg = mServiceHandler.obtainMessage();
                msg.arg1 = 1;
                mServiceHandler.sendMessage(msg);
            }
        }
    };
    backwardFromNoti = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            if (playHandler != null) {
                playHandler.reset();
                playing = false;
            }
            getSD();
            int i = 0;
            for (i = 0; i < send; i++) {
                if (link.equalsIgnoreCase(uris[i])) {
                    break;
                }
            }
            if (i == send || i == 0) {
                if (send > 0) {
                    name = names[send - 1];
                    link = uris[send - 1];
                    pre.edit().putString("name", name);
                    pre.edit().putString("online", online);
                    pre.edit().putString("link", link);
                    Message msg = mServiceHandler.obtainMessage();
                    msg.arg1 = 1;
                    mServiceHandler.sendMessage(msg);
                }
            } else {
                name = names[i - 1];
                link = uris[i - 1];
                pre.edit().putString("name", name);
                pre.edit().putString("online", online);
                pre.edit().putString("link", link);
                Message msg = mServiceHandler.obtainMessage();
                msg.arg1 = 1;
                mServiceHandler.sendMessage(msg);
            }
        }
    };
    stopFromNoti = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            if (playHandler != null) {
                playing = false;
                Intent in = new Intent(Mp3Constants.NOTIFICATION);
                in.putExtra("download", "0");
                in.putExtra("online", online);
                in.putExtra("status", Mp3Constants.COMPLETED);
                in.putExtra("name", name);
                in.putExtra("currentTime",
                        playHandler.getCurrentPosition() / 1000);
                in.putExtra("totalTime", playHandler.getDuration() / 1000);
                conte.sendBroadcast(in);
                playHandler.reset();
                stopSelf();
            }
            stopSelf();
        }
    };
    phoneStateListener = new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            if (state == TelephonyManager.CALL_STATE_RINGING) {
                if (playHandler != null)
                    if (playHandler.isPlaying()) {
                        playing = false;
                        playHandler.pause();
                    }
            } else if (state == TelephonyManager.CALL_STATE_IDLE) {
                if (!notFromTelephone) {
                    notFromTelephone = false;
                    if (playHandler != null)
                        if (!playHandler.isPlaying()) {
                            playSongNow();
                        }
                }
            } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                if (playHandler.isPlaying()) {
                    playing = false;
                    playHandler.pause();
                }
            }
            super.onCallStateChanged(state, incomingNumber);
        }
    };
    mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    if (mgr != null) {
        mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    }
    pre = getSharedPreferences("download", 0);
    online = pre.getString("online", "0");
    link = pre.getString("link", "");
    name = pre.getString("name", "");
    contentView = new RemoteViews(getPackageName(),
            R.layout.online_notification_layout);
    PendingIntent pit = PendingIntent.getBroadcast(conte, 0, new Intent(
            "stopfromnoti"), PendingIntent.FLAG_UPDATE_CURRENT);
    contentView.setOnClickPendingIntent(R.id.play_or_pause_noti, pit);
    notificationManager = (NotificationManager) conte
            .getSystemService(Context.NOTIFICATION_SERVICE);
    mBuilder = new NotificationCompat.Builder(conte)
            .setSmallIcon(R.drawable.icon).setContent(contentView)
            .setAutoCancel(false).setContentIntent(pit);
    startForeground(Mp3Constants.NOTIFICATION_NUMBER_FOR_PLAYER,
            mBuilder.build());
    broadcaster = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            if (arg1.getExtras().getInt("action") == Mp3Constants.PAUSE) {
                if (playHandler != null)
                    if (playHandler.isPlaying()) {
                        playing = false;
                        notFromTelephone = true;
                        playHandler.pause();
                    }
            } else if (arg1.getExtras().getInt("action") == Mp3Constants.PLAY) {
                if (playHandler != null)
                    if (!playHandler.isPlaying()) {
                        playSongNow();
                    }
            } else if (arg1.getExtras().getInt("action") == Mp3Constants.STOP) {
                if (playHandler != null) {
                    playHandler.reset();
                    playing = false;
                }
                stopSelf();
            } else if (arg1.getExtras().getInt("action") == Mp3Constants.SEEK) {
                if (playHandler != null) {
                    {
                        playHandler.seekTo(arg1.getExtras()
                                .getInt("seekto") * 1000);
                    }
                }
            } else if (arg1.getExtras().getInt("action") == Mp3Constants.FORWARD) {
                if (playHandler != null) {
                    playHandler.reset();
                    playing = false;
                }
                if (pre.getBoolean("repeat", false)) {
                    pre.edit().putString("name", name);
                    pre.edit().putString("online", online);
                    pre.edit().putString("link", link);
                    Message msg = mServiceHandler.obtainMessage();
                    msg.arg1 = 1;
                    mServiceHandler.sendMessage(msg);
                } else {
                    getSD();
                    if (pre.getBoolean("shuffle", false)) {
                        Random r = new Random();
                        int x = r.nextInt(send);
                        link = uris[x];
                        name = names[x];
                        pre.edit().putString("name", name);
                        pre.edit().putString("online", online);
                        pre.edit().putString("link", link);
                        Message msg = mServiceHandler.obtainMessage();
                        msg.arg1 = 1;
                        mServiceHandler.sendMessage(msg);
                    } else {
                        for (int i = 0; i < send - 1; i++) {
                            if (link.equalsIgnoreCase(uris[i])) {
                                link = uris[i + 1];
                                name = names[i + 1];
                                pre.edit().putString("name", name);
                                pre.edit().putString("online", online);
                                pre.edit().putString("link", link);
                                Message msg = mServiceHandler
                                        .obtainMessage();
                                msg.arg1 = 1;
                                mServiceHandler.sendMessage(msg);
                                break;
                            }
                        }
                    }
                }
                // getSD();
                // int i = 0;
                // for (i = 0; i < send; i++) {
                // if (link.equalsIgnoreCase(uris[i])) {
                // break;
                // }
                // }
                // if (i >= send - 1) {
                // if (send > 0) {
                // name = names[0];
                // link = uris[0];
                // pre.edit().putString("name", name);
                // pre.edit().putString("online", online);
                // pre.edit().putString("link", link);
                // Message msg = mServiceHandler.obtainMessage();
                // msg.arg1 = 1;
                // mServiceHandler.sendMessage(msg);
                // }
                // } else {
                // name = names[i + 1];
                // link = uris[i + 1];
                // pre.edit().putString("name", name);
                // pre.edit().putString("online", online);
                // pre.edit().putString("link", link);
                // Message msg = mServiceHandler.obtainMessage();
                // msg.arg1 = 1;
                // mServiceHandler.sendMessage(msg);
                // }

            } else if (arg1.getExtras().getInt("action") == Mp3Constants.BACKWARD) {
                if (playHandler != null) {
                    playHandler.reset();
                    playing = false;
                }
                if (pre.getBoolean("repeat", false)) {
                    pre.edit().putString("name", name);
                    pre.edit().putString("online", online);
                    pre.edit().putString("link", link);
                    Message msg = mServiceHandler.obtainMessage();
                    msg.arg1 = 1;
                    mServiceHandler.sendMessage(msg);
                } else {
                    getSD();
                    if (pre.getBoolean("shuffle", false)) {
                        Random r = new Random();
                        int x = r.nextInt(send);
                        link = uris[x];
                        name = names[x];
                        pre.edit().putString("name", name);
                        pre.edit().putString("online", online);
                        pre.edit().putString("link", link);
                        Message msg = mServiceHandler.obtainMessage();
                        msg.arg1 = 1;
                        mServiceHandler.sendMessage(msg);
                    } else {
                        int i = 0;
                        for (i = 0; i < send; i++) {
                            if (link.equalsIgnoreCase(uris[i])) {
                                break;
                            }
                        }
                        if (i == send || i == 0) {
                            if (send > 0) {
                                name = names[send - 1];
                                link = uris[send - 1];
                                pre.edit().putString("name", name);
                                pre.edit().putString("online", online);
                                pre.edit().putString("link", link);
                                Message msg = mServiceHandler
                                        .obtainMessage();
                                msg.arg1 = 1;
                                mServiceHandler.sendMessage(msg);
                            }
                        } else {
                            name = names[i - 1];
                            link = uris[i - 1];
                            pre.edit().putString("name", name);
                            pre.edit().putString("online", online);
                            pre.edit().putString("link", link);
                            Message msg = mServiceHandler.obtainMessage();
                            msg.arg1 = 1;
                            mServiceHandler.sendMessage(msg);
                        }
                        // for (int i = 0; i < send - 1; i++) {
                        // if (link.equalsIgnoreCase(uris[i])) {
                        // link = uris[i - 1];
                        // name = names[i - 1];
                        // pre.edit().putString("name", name);
                        // pre.edit().putString("online", online);
                        // pre.edit().putString("link", link);
                        // Message msg = mServiceHandler
                        // .obtainMessage();
                        // msg.arg1 = 1;
                        // mServiceHandler.sendMessage(msg);
                        // break;
                        // }
                        // }
                    }
                }
                // getSD();
                // int i = 0;
                // for (i = 0; i < send; i++) {
                // if (link.equalsIgnoreCase(uris[i])) {
                // break;
                // }
                // }
                // if (i == send || i == 0) {
                // if (send > 0) {
                // name = names[send - 1];
                // link = uris[send - 1];
                // pre.edit().putString("name", name);
                // pre.edit().putString("online", online);
                // pre.edit().putString("link", link);
                // Message msg = mServiceHandler.obtainMessage();
                // msg.arg1 = 1;
                // mServiceHandler.sendMessage(msg);
                // }
                // } else {
                // name = names[i - 1];
                // link = uris[i - 1];
                // pre.edit().putString("name", name);
                // pre.edit().putString("online", online);
                // pre.edit().putString("link", link);
                // Message msg = mServiceHandler.obtainMessage();
                // msg.arg1 = 1;
                // mServiceHandler.sendMessage(msg);
                // }
            }
        }
    };
    registerReceiver(broadcaster, new IntentFilter(
            "com.codebrew.bestmp3downloader.PPlayService"));
    registerReceiver(stopFromNoti, new IntentFilter("stopfromnoti"));
    registerReceiver(forwardFromNoti, new IntentFilter("forwardFromNoti"));
    registerReceiver(backwardFromNoti, new IntentFilter("backwardFromNoti"));
    HandlerThread thread = new HandlerThread("ServiceStartArguments", 0);

    // //..................
    // notificationManager = (NotificationManager) conte
    // .getSystemService(Context.NOTIFICATION_SERVICE);
    // mBuilder = new NotificationCompat.Builder(conte);
    // RemoteViews remoteViews = new RemoteViews(getPackageName(),
    // R.layout.notification_layout);
    // try {
    // mBuilder.setSmallIcon(R.drawable.icon);
    // mBuilder.setAutoCancel(false).setOngoing(true)
    // .setContent(remoteViews);
    // Uri uri = RingtoneManager
    // .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    // mBuilder.setSound(uri);
    // notificationManager.notify(Mp3Constants.NOTIFICATION_NUMBER,
    // mBuilder.build());
    // } catch (Exception e) {
    // e.printStackTrace();
    // }
    // //...................

    thread.start();
    mServiceHandler = new IncomingHandler(PPlayService.this);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // online = intent.getExtras().getString("online");
    // link = intent.getExtras().getString("link");
    // name = intent.getExtras().getString("name");
    online = pre.getString("online", "0");
    link = pre.getString("link", "");
    name = pre.getString("name", "");
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    mServiceHandler.sendMessage(msg);
    return START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    unregisterReceiver(broadcaster);
    unregisterReceiver(stopFromNoti);
    unregisterReceiver(forwardFromNoti);
    unregisterReceiver(backwardFromNoti);
    if (playHandler != null) {
        if (playHandler.isPlaying()) {
            playHandler.stop();
        }
        playHandler = null;
    }
    if (mgr != null) {
        mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
    }
    super.onDestroy();
    notificationManager.cancel(Mp3Constants.NOTIFICATION_NUMBER_FOR_PLAYER);
}

public void playSongNow() {
    try {
        playing = true;
        playHandler.start();
        runnable = new Runnable() {
            public void run() {
                while (playing) {
                    if (playing) {
                        try {
                            Intent in = new Intent(
                                    Mp3Constants.NOTIFICATION);
                            in.putExtra("download", "0");
                            in.putExtra("online", online);
                            in.putExtra("name", name);
                            in.putExtra("status", Mp3Constants.PLAYING);
                            if (playHandler.getCurrentPosition() / 1000 == playHandler
                                    .getDuration() / 1000)
                                th.stop();
                            in.putExtra("currentTime",
                                    playHandler.getCurrentPosition() / 1000);
                            in.putExtra("totalTime",
                                    playHandler.getDuration() / 1000);
                            if (currentFlag) {
                                currentFlag = false;
                                contentView.setTextViewText(
                                        R.id.name_of_the_song, name);
                                notificationManager
                                        .notify(Mp3Constants.NOTIFICATION_NUMBER_FOR_PLAYER,
                                                mBuilder.setContent(
                                                        contentView)
                                                        .build());
                            }
                            conte.sendBroadcast(in);
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        th = new Thread(runnable);
        th.start();
        playHandler.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                playing = false;
                pre.edit().putBoolean("stopped", true).commit();
                Intent in = new Intent(Mp3Constants.NOTIFICATION);
                in.putExtra("download", "0");
                in.putExtra("online", online);
                in.putExtra("status", Mp3Constants.COMPLETED);
                in.putExtra("name", name);
                try {
                    in.putExtra("currentTime",
                            playHandler.getCurrentPosition() / 1000);
                    in.putExtra("totalTime",
                            playHandler.getDuration() / 1000);
                } catch (Exception e) {
                    in.putExtra("currentTime", 0);
                    in.putExtra("totalTime", 0);
                }
                conte.sendBroadcast(in);
                if (online.equals("0")) {
                    if (pre.getBoolean("repeat", false)) {
                        pre.edit().putString("name", name);
                        pre.edit().putString("online", online);
                        pre.edit().putString("link", link);
                        Message msg = mServiceHandler.obtainMessage();
                        msg.arg1 = 1;
                        mServiceHandler.sendMessage(msg);
                    } else {
                        getSD();
                        if (pre.getBoolean("shuffle", false)) {
                            Random r = new Random();
                            int x = r.nextInt(send);
                            link = uris[x];
                            name = names[x];
                            pre.edit().putString("name", name);
                            pre.edit().putString("online", online);
                            pre.edit().putString("link", link);
                            Message msg = mServiceHandler.obtainMessage();
                            msg.arg1 = 1;
                            mServiceHandler.sendMessage(msg);
                        } else {
                            for (int i = 0; i < send - 1; i++) {
                                if (link.equalsIgnoreCase(uris[i])) {
                                    link = uris[i + 1];
                                    name = names[i + 1];
                                    pre.edit().putString("name", name);
                                    pre.edit().putString("online", online);
                                    pre.edit().putString("link", link);
                                    Message msg = mServiceHandler
                                            .obtainMessage();
                                    msg.arg1 = 1;
                                    mServiceHandler.sendMessage(msg);
                                    break;
                                }
                            }
                        }
                    }
                }
                if (online.equals("1")) {
                    // stopSelf();
                }
            }
        });
    } catch (Exception e) {
        playing = false;
        Intent in = new Intent(Mp3Constants.NOTIFICATION);
        in.putExtra("download", "0");
        in.putExtra("online", online);
        in.putExtra("name", name);
        in.putExtra("status", Mp3Constants.FAILED);
        in.putExtra("currentTime", 0);
        in.putExtra("totalTime", 0);
        conte.sendBroadcast(in);
        Toast.makeText(
                getBaseContext(),
                "Error playing: "
                        + name
                        + "\nFile broken or deleted! Please try another song",
                Toast.LENGTH_SHORT).show();
        stopSelf();
    }
}

private void getSD() {
    File f = new File(Environment.getExternalStorageDirectory().toString()
            + "/Music");
    File[] files = f.listFiles();
    if (files == null) {
        return;
    }
    Arrays.sort(files, new Comparator<Object>() {
        public int compare(Object o1, Object o2) {

            if (((File) o1).lastModified() > ((File) o2).lastModified()) {
                return +1;
            } else if (((File) o1).lastModified() < ((File) o2)
                    .lastModified()) {
                return -1;
            } else {
                return 0;
            }
        }
    });
    send = files.length;
    uris = new String[send];
    names = new String[send];
    for (int i = 0; i < send; i++) {
        File file = files[i];
        // take the file name only
        double size = file.length();
        size = size / (1024 * 1024);
        String myfile = file
                .getPath()
                .substring(file.getPath().lastIndexOf("/") + 1,
                        file.getPath().length()).toLowerCase();
        uris[send - 1 - i] = file.getPath();
        names[send - 1 - i] = myfile;
    }
}

static class IncomingHandler extends Handler {
    private final WeakReference<PPlayService> mService;

    IncomingHandler(PPlayService service) {
        mService = new WeakReference<PPlayService>(service);
    }

    @Override
    public void handleMessage(Message msg) {
        PPlayService service = mService.get();
        if (service != null) {
            service.handleMessage(msg);
        }
    }
}

}

0 个答案:

没有答案