2015-11-17 14:14:10 jian51868 阅读数 3489
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    18316 人正在学习 去看看 高煥堂

这些都是调用android系统自身的所有没有什么难的。

                 /*调用短信*/
dx = (Button) findViewById(R.id.dx);
dx.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
Uri smsToUri = Uri.parse("smsto:10010");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", "测试发送短信");
startActivity(intent);
}
});
/*播放声音*/
sy = (Button) findViewById(R.id.sy);
sy.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
soundPool= new SoundPool(10,AudioManager.STREAM_SYSTEM,5);
soundPool.load(MainActivity.this,R.raw.a,1);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
soundPool.play(1,1, 1, 0, 0, 1);
}
});
}
});


关于SoundPool的setOnLoadCompleteListener介绍和一些参数参见:http://blog.csdn.net/worker90/article/details/7061538,感谢网友的文章

2011-03-19 04:51:54 shazhuzhu1 阅读数 25
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    18316 人正在学习 去看看 高煥堂

首先上层java调用

XXXPlayer

AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

audiomanager就是我们定义的控制系统声音的对象,(如果context报错,可将其改成XXXPlayer.this)

audiomanager.SetStreamVolume(AA,BB,CC),是我们可以直接使用的AudioManager的成员函数,3个参数表示的意思:AA:有内置的常量,可以在AudioManager里面查到相关的定义,我们在此用 AudioManager.STREAM_MUSIC, BB:自己设置音量的值,CC:也是一些标示量,我在此设置为0;

 

1.AudioManager.java

public void setStreamVolume(int streamType, int index, int flags);上层接口

       1)调用IAudioService service = getService(); 当程序开启时会获得service,调用此来获得

2.执行ServiceManager.java
public static IBinder getService(String name)获取audio服务

3.AudioService.java
public void setStreamVolume(int streamType, int index, int flags)//服务接口
   1) private void setStreamVolumeInt(int streamType, int index, boolean force, boolean lastAudible)//服务函数
   2)调用以下函数  
sendMsg(mAudioHandler, MSG_SET_SYSTEM_VOLUME, streamType, SENDMSG_NOOP, 0, 0,streamState, 0)
       //Post message to set system volume (it in turn will post a message
                  // to persist)
3)AudioHandler::setSystemVolume(VolumeStreamState streamState);//sendmsg(...)后执行函数
   4)调用AudioHandler::setStreamVolumeIndex(int stream, int index)
    5)AudioSystem.setStreamVolumeIndex(stream,index);//audioSystem接口

static int android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, jint index)
1)调用AudioSystem::setStreamVolumeIndex

6.status_t AudioSystem::setStreamVolumeIndex(stream_type stream, int index)(处理到这时,也可以直接走AudioFlinger路线,不经过策略)
1)获得服务 const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
2)调用aps->setStreamVolumeIndex(stream, index)

7.status_t AudioPolicyService::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
1)调用mpPolicyManager->setStreamVolumeIndex(stream, index)
status_t AudioPolicyManager::setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
1)记录音量index: mStreams[stream].mIndexCur = index
2)compute and apply stream volume on all outputs:
checkAndSetVolume(stream, index, mOutputs.keyAt(i), mOutputs.valueAt(i)->device())

8.status_t AudioPolicyManager::checkAndSetVolume(int stream, int index, audio_io_handle_t output, uint32_t device, int delayMs, bool force)
1)计算音量:float volume = computeVolume(stream, index, output, device);
2)调用:mpClientInterface->setStreamVolume((AudioSystem::stream_type)stream, volume, output, delayMs);

9.status_t AudioPolicyService::setStreamVolume(AudioSystem::stream_type stream, float volume, audio_io_handle_t output, int delayMs)
调用mAudioCommandThread->volumeCommand((int)stream, volume, (int)output, delayMs);

10.status_t AudioPolicyService::AudioCommandThread::volumeCommand(int stream, float volume, int output, int delayMs)
调用insertCommand_l(command, delayMs);

 

补充1)在条用getService();获取服务的时候 ,实际调用的是ServiceManager.getService(context);

系统服务都是由serviceManager来管理的,要添加服务,可以调用serviceManager.AddService(context,service);

每添加一个service,都会有对应的唯一context, 当getService的时候就会根据context获得相应的服务,

可查看ServiceManager.java, ServiceManager.h/cpp

补充2) AudioService 的接口在 IaudioService.aidl中定义。添加自定义功能时( 我们创建控制接口比如创建个音效处理的接口SetEffectVolume(XXX),可以参照SetStreamVolume(a,b,c))别忘了修改此处,否则,AudioManager 会出现cannot find symbol..错误!!!

 

补充3)编译的时候可能会在Audiomanager.java中调用自己写的接口时出错,此时先将该文件中的调用注释掉,执行 make update-api

执行完成后,将注释去掉,然后从新编译。。。

2019-12-21 08:51:34 weixin_42401291 阅读数 47
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    18316 人正在学习 去看看 高煥堂

1.

private   Vibrator mVibrator;  //声明一个振动器对象

2.

@Override
protected void onCreate(Bundle savedInstanceState) {
/**
 * 想设置震动大小可以通过改变pattern来设定,如果开启时间太短,震动效果可能感觉不到
 */
mVibrator = (Vibrator) getApplication().getSystemService(Service.VIBRATOR_SERVICE);

}

 

3.

//            findViewById(R.id.button10).setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//
//                System.out.println("震动+铃声");
//
//                Remind(1);
//
//
//            }
//        });

4.

//提示效果
public  void  Remind(int action)
{
    try
    {


    switch (action)
    {
        case 0:
            //失败提示效果
            mVibrator.vibrate(new long[]{500, 300, 500, 300}, -1);
            //停止500毫秒,开启震动300毫秒,然后又停止500毫秒,又开启震动300毫秒,不重复.

            break;
        case 1:
            //成功提示效果
            mVibrator.vibrate(new long[]{0, 200,}, -1);
            //开启震动200毫秒,不重复.

            //用于获取手机默认提示音的Uri
            Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone rt = RingtoneManager.getRingtone(getApplicationContext(), uri);
            rt.play();


            break;
        case 2:
            break;
    }
    }
    catch (Exception e)
    {

    }


}
2018-01-29 11:56:27 Applicaton 阅读数 2355
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    18316 人正在学习 去看看 高煥堂

Android提供了音频API MediaPlayer AudioTrack 

还有一种轻量级的叫SoundPool 它适合播放那些需要反复播放,但时间较短的音效。它支持同时播放多种声音,这些声音在系统开始时会加载到列表中,按照这些声音的id,我们可以调用这些音效。

我们可以看下创建方法和使用

SoundPool(int maxStreams, int streamType, int srcQuality)的参数

maxStreams:指定支持多少个声音,SoundPool对象中允许同时存在的最大流的数量

streamType:声音类型,流类型可以分为STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和 STREAM_ALARM四种类型。在AudioManager

定义

srcQuality:声音品质(采样率变换质量),当前无效果,用0作为默认

SoundPool.Builder

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

soundID:Load()返回的声音ID号

leftVolume:左声道音量设置

rightVolume:右声道音量设置

priority:播放声音的优先级,数值越高,优先级越大。

loop:是否循环:-1表示无限循环,0表示不循环,其他值表示要重复播放的次数

rate:播放速率:播放速率的取值范围是0.5至2.0,1.0为原始播放速率,2.0的播放速率为原始速率的两位。0.5的播放速率为原始速率的一半。

release()方法释放所有SoundPool对象占据的内存和资源,也可以指定要释放的ID


简单来说要五步

创建SoundPool 加载资源ID 播放资源ID  Stop资源ID 释放资源ID

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;

import static android.content.Context.AUDIO_SERVICE;

public class SoundPoolManager {

    private boolean playing = false;
    private boolean loaded = false;
    private float actualVolume;
    private float maxVolume;
    private float volume;
    private AudioManager audioManager;
    private SoundPool soundPool;
    private int ringingSoundId;
    private int ringingStreamId;
    private int disconnectSoundId;
    private static SoundPoolManager instance;
    /*Mny*/
    private int outgoingSoundId;

    private SoundPoolManager(Context context) {
        // AudioManager audio settings for adjusting the volume
        audioManager = (AudioManager) context.getSystemService(AUDIO_SERVICE);
        actualVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        volume = actualVolume / maxVolume;

        // Load the sounds
        //因为在5.0上new SoundPool();被弃用 5.0上利用Builder
        //创建SoundPool
        int maxStreams = 1;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool.Builder()
                    .setMaxStreams(maxStreams)
                    .build();
        } else {
            soundPool = new SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0);
        }

        soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                loaded = true;
            }

        });
        //加载资源ID
        ringingSoundId = soundPool.load(context, R.raw.incoming, 1);
        disconnectSoundId = soundPool.load(context, R.raw.disconnect, 1);
        outgoingSoundId = soundPool.load(context, R.raw.outgoing, 1);
    }

    public static SoundPoolManager getInstance(Context context) {
        if (instance == null) {
            instance = new SoundPoolManager(context);
        }
        return instance;
    }
    //播放
    public void playRinging() {
        if (loaded && !playing) {
            ringingStreamId = soundPool.play(ringingSoundId, volume, volume, 1, -1, 1f);
            playing = true;
        }
    }
    //Stop播放
    public void stopRinging() {
        if (playing) {
            soundPool.stop(ringingStreamId);
            playing = false;
        }
    }
    public void release() {
        if (soundPool != null) {
            soundPool.unload(ringingSoundId);
            soundPool.unload(disconnectSoundId);
            soundPool.release();
            soundPool = null;
        }
        instance = null;
    }
}









2014-05-13 10:55:05 bluewindaa 阅读数 577
  • Android底层技术:HAL驱动开发

    本课程提供开发者学习Android底层的HAL(硬件抽象层)的开发方法和技术。HAL所在的位置是介于Android系统服务与Linux内核之间,HAL Driver是以library形式出现,给HAL Stub调用,供Android System架构者调用。而HAL Stub则是google设计出来的,保护硬件厂商的硬件驱动。

    18316 人正在学习 去看看 高煥堂

目前做的一个项目里用到了提示音,但是又不想添加提示音到库里,便开始研究调用系统自带的提示音,最后终于找到了。

开始在CC上查发现好像很多人都在问,但没人回答,我就把自己查到的东西和写的一个demo给大家分享下吧

首先要在工程里加入Audio Toolbox framework这个库,然后在需要调用的文件里#import <AudioToolbox/AudioToolbox.h>

最后在需要播放提示音的地方写上
AudioServicesPlaySystemSound(1106); 
注:括号中为系统声音的id,详见最下面的列表。

为了方便大家测试系统声音,我写了一个demo供大家使用下载。

另外,如果想用自己的音频文件创建系统声音来播放的同学可以参考如下代码。

//Get the filename of the sound file:
NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], @"/jad0007a.wav"];

//declare a system sound
id SystemSoundID soundID;

//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

//Use audio sevices to create the sound
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
//Use audio services to play the sound
AudioServicesPlaySystemSound(soundID);

顺便附上系统提示音对应的列表

AudioServices

AudioServices is a group of C functions in AudioToolbox for playing short (≤30 seconds) sounds.

Predefined sounds

There are some predefined system sounds, for the system sound ID in the range 1000 to 2000 (decimal), as shown below (from 2.0 to 5.0 beta). The system sounds are all stored in /System/Library/Audio/UISounds/.

kSystemSoundID_Vibrate.

没有更多推荐了,返回首页