アンドロイドでボリュームを制御するためにSeekBarを使用する?

アンドロイド端末のボリュームボタンで音量をコントロールせずに、シークバーを使ってアプリの音量を正確に変更するにはどうしたらよいですか?私は音量を制御するためにシークバーを使用したい理由です私のアンドロイドのボリュームキーで別々の機能を持っています。どなたか教えてください。

ソリューション

以下のコードを見てください。それはあなたの問題を解決します。

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class TestExample extends Activity 
{
    /** Called when the activity is first created. */

    private SeekBar volumeSeekbar = null;
    private AudioManager audioManager = null; 

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        setContentView(R.layout.main);
        initControls();
    }

    private void initControls()
    {
        try
        {
            volumeSeekbar = (SeekBar)findViewById(R.id.seekBar1);
            audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            volumeSeekbar.setMax(audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_MUSIC));
            volumeSeekbar.setProgress(audioManager
                    .getStreamVolume(AudioManager.STREAM_MUSIC));   

            volumeSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() 
            {
                @Override
                public void onStopTrackingTouch(SeekBar arg0) 
                {
                }

                @Override
                public void onStartTrackingTouch(SeekBar arg0) 
                {
                }

                @Override
                public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) 
                {
                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
                            progress, 0);
                }
            });
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
解説 (12)

これは、ボリュームレベルを調整するために使用したカスタムビューです。指を上にスライドさせることで動作しますが、簡単に変更することができます。

**スライダービュー


public class SliderView extends View implements OnGestureListener, OnTouchListener {

private int mHeight = 0;

private int mMaxValue = 16;
private float mDelta = 0;
private int mColor = Color.WHITE;
private GestureDetector mGestureDetector;

private OnValueChangeListener mListener;

public SliderView(Context context) {
    super(context);
    init(context);
}

public SliderView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public SliderView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
}

@Override
public boolean onDown(MotionEvent e) {
    mDelta = 0;
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    return false;
}

@Override
public void onLongPress(MotionEvent e) {
    mDelta = 0;
}

@Override
public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {

    if (mDelta >= 1 || mDelta 
解説 (0)

@CommonsWare は、https://github.com/commonsguy/cw-omnibus/tree/master/SystemServices/Volume でこのようにし、SeekBar を使って5種類のボリュームを設定することもできます。

5種類のボリュームを扱う

/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
*/

package com.commonsware.android.syssvc.volume;

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.widget.SeekBar;

public class Volumizer extends Activity {
  SeekBar alarm=null;
  SeekBar music=null;
  SeekBar ring=null;
  SeekBar system=null;
  SeekBar voice=null;
  AudioManager mgr=null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mgr=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

    alarm=(SeekBar)findViewById(R.id.alarm);
    music=(SeekBar)findViewById(R.id.music);
    ring=(SeekBar)findViewById(R.id.ring);
    system=(SeekBar)findViewById(R.id.system);
    voice=(SeekBar)findViewById(R.id.voice);

    initBar(alarm, AudioManager.STREAM_ALARM);
    initBar(music, AudioManager.STREAM_MUSIC);//for Volume this is neccessary
    initBar(ring, AudioManager.STREAM_RING);
    initBar(system, AudioManager.STREAM_SYSTEM);
    initBar(voice, AudioManager.STREAM_VOICE_CALL);
  }

  private void initBar(SeekBar bar, final int stream) {
    bar.setMax(mgr.getStreamMaxVolume(stream));
    bar.setProgress(mgr.getStreamVolume(stream));

    bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
      public void onProgressChanged(SeekBar bar, int progress,
                                    boolean fromUser) {
        mgr.setStreamVolume(stream, progress,
                            AudioManager.FLAG_PLAY_SOUND);
      }

      public void onStartTrackingTouch(SeekBar bar) {
        // no-op
      }

      public void onStopTrackingTouch(SeekBar bar) {
        // no-op
      }
    });
  }
}

また、Volumeのみを制御する場合は music=(SeekBar)findViewById(R.id.music);initBar(music, AudioManager.STREAM_MUSIC);` があります。

解説 (0)