使用CCL和不使用CCL锁定屏幕音量控制

时间:2015-05-31 10:14:08

标签: android volume lockscreen

我可以在VolumeService中监听音量级别。此服务在后台收听音量级别。 我的问题是:我无法控制锁定屏幕中的音量。 我尝试了两种不同的音量控制方式

CCL的第一种方式
申请类:

WeakSet

MainActivity:

public class CastApplication extends Application {

    private static String APPLICATION_ID;
    public static final double VOLUME_INCREMENT = 0.03;

    @Override
    public void onCreate() {
        super.onCreate();
        APPLICATION_ID = getString(R.string.app_id);
        // initialize VideoCastManager
        VideoCastManager.initialize(this, APPLICATION_ID, VideoCastControllerActivity.class, null).
                setVolumeStep(VOLUME_INCREMENT).enableFeatures(VideoCastManager.FEATURE_NOTIFICATION |VideoCastManager.FEATURE_LOCKSCREEN |
                VideoCastManager.FEATURE_WIFI_RECONNECT | VideoCastManager.FEATURE_CAPTIONS_PREFERENCE |VideoCastManager.FEATURE_DEBUGGING);
    }
}

没有CCL的第二种方式(有RRC)
MainActivity:

public class MainActivity extends FragmentActivity {
    private VideoCastManager mCastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        VideoCastManager.checkGooglePlayServices(this);
        mCastManager = VideoCastManager.getInstance();
        Intent i1 = new Intent(this,VolumeService.class);
        startService(i1);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (mCastManager.onDispatchVolumeKeyEvent(event, CastApplication.VOLUME_INCREMENT)) {
            return true;
        }
        return super.dispatchKeyEvent(event);
    }
}

服务和ContentObserver两种方式相同

VolumeService:

public class MainActivity extends FragmentActivity {
    ContentObserver mSettingsContentObserver;
    RemoteControlClient remoteControlClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        mAudioManager.requestAudioFocus(null, AudioManager.STREAM_RING,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
        RemoteControlClientCompat mRemoteControlClientCompat = new RemoteControlClientCompat(PendingIntent.getBroadcast(this.getApplicationContext(), 0,intent, 0));
        RemoteControlHelper.registerRemoteControlClient(mAudioManager,mRemoteControlClientCompat);
        remoteControlClient = new RemoteControlClient((PendingIntent.getBroadcast(this.getApplicationContext(), 0,intent, 0)));
        MediaRouter.getInstance(this.getApplicationContext()).addRemoteControlClient(remoteControlClient);
        Intent i1 = new Intent(this,VolumeService.class);
        startService(i1);
    }
}

ContentObserver:

public class VolumeService extends Service {
    ContentObserver mSettingsContentObserver;
    @Override
    public void onCreate() {
        super.onCreate();
        mSettingsContentObserver = new SettingsContentObserver(this, new Handler());
        getApplicationContext().getContentResolver().registerContentObserver(
                android.provider.Settings.System.CONTENT_URI, true,mSettingsContentObserver);
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver);
    }
}

清单:

public class SettingsContentObserver extends ContentObserver {
    int previousVolume;
    Context context;

    public SettingsContentObserver(Context c, Handler handler) {
        super(handler);
        context = c;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        previousVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 
    }
    @Override
    public boolean deliverSelfNotifications() {
        return super.deliverSelfNotifications();
    }
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        int currentVolume = audio.getStreamVolume(AudioManager.STREAM_RING);
        int delta = previousVolume - currentVolume;
        if (delta > 0) {
            Log.i("MyService", "Volume is down");
            previousVolume = currentVolume;
        } else if (delta < 0) {
            Log.i("MyService", "Volume is up");
            previousVolume = currentVolume;
        }
    }
}

0 个答案:

没有答案