Android 怎么才用蓝牙耳机mic的mic作为音频输入呢?新手,求高人指点!非常感谢!

蓝牙耳机听歌什么的都没问题。就是打接电话都没声音?要是MIC坏了?那也能听到别人说话才是。要是喇叭_百度知道
蓝牙耳机听歌什么的都没问题。就是打接电话都没声音?要是MIC坏了?那也能听到别人说话才是。要是喇叭
牙耳机听歌什么的都没问题。就是打接电话都没声音?要是MIC坏了?那也能听到别人说话才是。要是喇叭坏了听歌又有声音,求大神解答。是蓝牙IC坏了么
您的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
我有更好的答案
我正在做,想了解,欢迎交流
为您推荐:
其他类似问题
蓝牙耳机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Amazon CAPTCHA
请输入您在这个图片中看到的字符:
& , Amazon.com, Inc. or its affiliates匿名用户不能发表回复!|这篇文章主要是记录前段时间开发所用到的一些技术,在这里做个总结,文中有不足之处还请看到本文的你多多指点。分享分享开发经验,一起提高!
1、WIFI(打开,关闭,使能,扫描等)
2、蓝牙(打开关闭)
3、电池(获取电池的各种参数和状态信息)
4、背光(背光调节)
5、U盘/SDcard(判断是否插入,读取等)
6、屏幕校准(准确的说是点击屏幕的准确度,不是校准屏幕,这是一个简单的算法,这里只提供思路了:屏幕上放5个Button,分别位于左上;左下;右上;右下;获取图片所在屏幕的位置,和图片的长宽,在用户点击Button时获取点击的坐标位置,进行判断。这种方式可能不正确,希望看到这篇文章的各位前辈大哥指点)
7、振动马达(简单的调用振动马达的服务)
8、摄像头(简单的预览图像)
9、按键(获取用户点击的按键,包括Home按键)
10、音乐(使用MediaPlayer调用音频文件播放)
11、MIC(获得当前录音的振幅和录制音频文件)
12、重力感应(通过监听方式获取X、Y、Z三点坐标的值)
以上是对本文提到的几个基本功能的简单介绍,如果你看到此处说明很期待下文。哈哈,且看一下代码!记住这里只是一些基本功能的使用,至于要实现其他的效果,还是要看自己好好研究了。一般看看API和提供的DEMO都能解决的。
packagecn.
importjava.util.L
importandroid.content.C
importandroid.net.wifi.ScanR
importandroid.net.wifi.WifiC
importandroid.net.wifi.WifiI
importandroid.net.wifi.WifiM
importandroid.net.wifi.WifiManager.WifiL
publicclassWifiHelper{
privateWifiManagermWifiM
privateWifiInfomWifiI
privateList&ScanResult&mWifiL
privateList&WifiConfiguration&mWifiC
WifiLockmWifiL
publicWifiHelper(Contextcontext){
mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mWifiInfo=mWifiManager.getConnectionInfo();
publicWifiManagergetWifiManager(){
returnmWifiM
publicbooleanopenWifi(){
booleanflag=false;
if(!mWifiManager.isWifiEnabled()){
flag=mWifiManager.setWifiEnabled(true);
}elseif(mWifiManager.isWifiEnabled()){
flag=true;
publicvoidcloseWifi(){
if(!mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(false);
publicvoidacquireWifiLock(){
mWifiLock.acquire();
publicvoidreleaseWifiLock(){
if(mWifiLock.isHeld()){
mWifiLock.acquire();
publicvoidcreatWifiLock(){
mWifiLock=mWifiManager.createWifiLock("Test");
publicList&WifiConfiguration&getConfiguration(){
returnmWifiC
publicvoidconnectConfiguration(intindex){
if(index&mWifiConfiguration.size()){
mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);
publicvoidstartScan(){
mWifiManager.startScan();
mWifiList=mWifiManager.getScanResults();
mWifiConfiguration=mWifiManager.getConfiguredNetworks();
publicList&ScanResult&getWifiList(){
mWifiManager.startScan();
returnmWifiManager.getScanResults();
publicStringBuilderlookUpScan(List&ScanResult&list){
StringBuilderstringBuilder=newStringBuilder();
for(inti=0;i&list.size();i++){
stringBuilder
.append("\n结果"+newInteger(i+1).toString()+"(");
stringBuilder.append((list.get(i)).toString());
stringBuilder.append(")\n");
returnstringB
publicStringgetMacAddress(){
return(mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();
publicStringgetBSSID(){
return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();
publicintgetIPAddress(){
return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();
publicintgetNetworkId(){
return(mWifiInfo==null)?0:mWifiInfo.getNetworkId();
publicStringgetWifiInfo(){
return(mWifiInfo==null)?"NULL":mWifiInfo.toString();
publicvoidaddNetwork(WifiConfigurationwcg){
intwcgID=mWifiManager.addNetwork(wcg);
mWifiManager.enableNetwork(wcgID,true);
publicvoiddisconnectWifi(intnetId){
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
booleanflag=false;
preclass="java"name="code"&BluetoothAdapterbluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter.isEnabled()) { bluetoothAdapter.disable(); flag = bluetoothAdapter.enable(); } else { flag = bluetoothAdapter.enable(); }
1、新建一个广播接收类
packagecn.
importandroid.content.BroadcastR
importandroid.content.C
importandroid.content.I
importandroid.content.res.R
importandroid.os.BatteryM
importandroid.util.L
importjava.util.ArrayL
publicclassBatteryBroadcastReceiverextendsBroadcastReceiver{
privateint
privateint
privateint
privateStringstatusS
privateStringhealthS
privateStringacS
privateResourcesmR
privateStringBufferbuffer=newStringBuffer();
privatestaticintcount=0;
privateArrayList&String&batteryM
publicBatteryBroadcastReceiver(Resourcesres){
mResources=
batteryMsg=newArrayList&String&();
publicvoidonReceive(Contextcontext,Intentintent){
action=intent.getAction();
status=intent.getIntExtra("status",0);
health=intent.getIntExtra("health",0);
plugged=intent.getIntExtra("plugged",0);
switch(status){
caseBatteryManager.BATTERY_STATUS_UNKNOWN:
statusString="unknown";
caseBatteryManager.BATTERY_STATUS_CHARGING:
statusString="charging";
caseBatteryManager.BATTERY_STATUS_DISCHARGING:
statusString="discharging";
caseBatteryManager.BATTERY_STATUS_NOT_CHARGING:
statusString="notcharging";
caseBatteryManager.BATTERY_STATUS_FULL:
statusString="full";
switch(health){
caseBatteryManager.BATTERY_HEALTH_UNKNOWN:
healthString="unknown";
caseBatteryManager.BATTERY_HEALTH_GOOD:
healthString="good";
caseBatteryManager.BATTERY_HEALTH_OVERHEAT:
healthString="overheat";
caseBatteryManager.BATTERY_HEALTH_DEAD:
healthString="dead";
caseBatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
healthString="voltage";
caseBatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
healthString="unspecifiedfailure";
switch(plugged){
caseBatteryManager.BATTERY_PLUGGED_AC:
acString="pluggedac";
caseBatteryManager.BATTERY_PLUGGED_USB:
acString="pluggedusb";
2、注册广播
IntentFilterintentFilter=newIntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryReceiver,intentFilter);
packagecn.
importandroid.app.A
importandroid.app.AlertD
importandroid.content.DialogI
importandroid.content.I
importandroid.content.res.R
importandroid.os.B
importandroid.os.H
importandroid.os.M
importandroid.os.RemoteE
importandroid.provider.S
importandroid.provider.Settings.SettingNotFoundE
importandroid.util.L
importandroid.view.V
importandroid.view.View.OnClickL
importandroid.widget.B
importandroid.widget.ProgressB
importandroid.widget.SeekB
importandroid.widget.SeekBar.OnSeekBarChangeL
importandroid.os.IPowerM
importandroid.os.ServiceM
importstaticcn.tch.Constant.*;
publicclassBacklightActivityextendsActivityimplementsOnSeekBarChangeListener{
privatefinalstaticStringTAG="BacklightActivity";
privateSeekBarseekB
privateButtonbtnF
privateintmOldBrightness=0;
privatestaticfinalintMINIMUM_BACKLIGHT=android.os.Power.BRIGHTNESS_DIM+10;
privatestaticfinalintMAXIMUM_BACKLIGHT=android.os.Power.BRIGHTNESS_ON;
privatebooleanisRun=true;
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.backlight);
res=getResources();
seekBar=(SeekBar)findViewById(R.id.bl_seekbar);
btnFinish=(Button)findViewById(R.id.bl_finish);
initBrightness();
seekBar.setOnSeekBarChangeListener(this);
btnFinish.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewv){
newAlertDialog.Builder(BacklightActivity.this).setIcon(
R.drawable.icon).setTitle(res.getString(R.string.backlight_title))
.setMessage(res.getString(R.string.backlight_msg)).setPositiveButton(
res.getString(R.string.yes),dialogClick)
.setNegativeButton(res.getString(R.string.no),dialogClick).create().show();
privateandroid.content.DialogInterface.OnClickListenerdialogClick=newandroid.content.DialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhich){
switch(which){
caseDialogInterface.BUTTON_POSITIVE:
resultRquest(true);
caseDialogInterface.BUTTON_NEGATIVE:
resultRquest(false);
privatevoidresultRquest(booleanflag){
Intentintent=newIntent(this,MainActivity.class);
intent.putExtra(BACKLIGHT_RESULT,flag);
setResult(REQUESTCODE_BACKLIGHT_RESULT,intent);
publicvoidonProgressChanged(SeekBarseekBar,intprogress,
booleanfromUser){
intstep=25;
Settings.System.putInt(BacklightActivity.this.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,progress+MINIMUM_BACKLIGHT);
setBrightness(progress+MINIMUM_BACKLIGHT);
privatevoidinitBrightness(){
mOldBrightness=Settings.System.getInt(BacklightActivity.this.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);
}catch(SettingNotFoundExceptione){
mOldBrightness=MAXIMUM_BACKLIGHT;
seekBar.setMax(MAXIMUM_BACKLIGHT-MINIMUM_BACKLIGHT);
Log.v("Brightnessmax","setmax:"+(MAXIMUM_BACKLIGHT-MINIMUM_BACKLIGHT));
seekBar.setProgress(0);
newThread(newRunnable(){
intvalue=0;
publicvoidrun(){
while(isRun){
Thread.sleep(150);
value=value+5;
Messagemessage=newMessage();
message.what=
handler.sendEmptyMessage(message.what);
}catch(InterruptedExceptione){
}).start();
privateHandlerhandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
if(msg.what&=MAXIMUM_BACKLIGHT){
seekBar.setProgress(msg.what);
setBrightness(msg.what);
isRun=false;
privatevoidsetBrightness(intbrightness){
IPowerManagerpower=IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
if(power!=null){
power.setBacklightBrightness(brightness);
}catch(RemoteExceptiondoe){
Log.e(TAG,"SettingBrightnessRemoteException!");
publicvoidonStartTrackingTouch(SeekBarseekBar){}
publicvoidonStopTrackingTouch(SeekBarseekBar){}
5、判断SDcard和获取SDCard的路径
staticStringgetSdcardPath(){
returnEnvironment.getExternalStorageDirectory().getPath();
staticbooleancheckSdcard(){
booleanflag=false;
if(Environment.getExternalStorageDirectory().toString().equals("/mnt/sdcard")){
flag=true;
6、屏幕校准(请参看前面说明)
7、振动马达
vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
long[]pattern={
800,50,400,30
vibrator.vibrate(pattern,2);
8、摄像头(拍照和预览)
publicclassCameraActivityextendsActivity{
privatefinalstaticStringTAG="CameraActivity";
privateSurfaceViewsurfaceV
privateSurfaceHoldersurfaceH
privateButtonbtnF
privateDialogmD
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.camera);
setupViews();
privatevoidsetupViews(){
surfaceView=(SurfaceView)findViewById(R.id.camera_preview);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(surfaceCallback);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
res=getResources();
btnFinish=(Button)findViewById(R.id.camera_finish);
btnFinish.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewv){
if(mDialog==null){
mDialog=newAlertDialog.Builder(CameraActivity.this).setIcon(
R.drawable.icon).setTitle(res.getString(R.string.camera_title))
.setMessage(res.getString(R.string.camera_msg)).setPositiveButton(
res.getString(R.string.yes),dialogClick)
.setNegativeButton(res.getString(R.string.no),dialogClick).create();
mDialog.show();}
privateandroid.content.DialogInterface.OnClickListenerdialogClick=newandroid.content.DialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhich){
switch(which){
caseDialogInterface.BUTTON_POSITIVE:
resultRquest(true);
caseDialogInterface.BUTTON_NEGATIVE:
resultRquest(false);
privatevoidresultRquest(booleanflag){
Intentintent=newIntent(CameraActivity.this,MainActivity.class);
intent.putExtra(CAMERA_RESULT,flag);
setResult(REQUESTCODE_CAMERA_RESULT,intent);
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_CAMERA
||keyCode==KeyEvent.KEYCODE_SEARCH){
takePic();
returntrue;
returnsuper.onKeyDown(keyCode,event);
privatevoidtakePic(){
camera.stopPreview();
camera.takePicture(null,null,pictureCallback);
Camera.PictureCallbackpictureCallback=newCamera.PictureCallback(){
publicvoidonPictureTaken(byte[]data,Cameracamera){
newSavePictureTask().execute(data);
camera.startPreview();
classSavePictureTaskextendsAsyncTask&byte[],String,String&{
protectedStringdoInBackground(byte[]...params){
picture=newFile(Environment.getExternalStorageDirectory(),
"picture.jpg");
if(picture.exists())
picture.delete();
FileOutputStreamfos=newFileOutputStream(picture.getPath());
fos.write(params[0]);
fos.close();
}catch(Exceptione){
e.printStackTrace();
returnnull;
SurfaceHolder.CallbacksurfaceCallback=newSurfaceHolder.Callback(){
publicvoidsurfaceCreated(SurfaceHolderholder){
camera=Camera.open();
camera.setPreviewDisplay(holder);
}catch(IOExceptione){
camera.release();
camera=null;
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){
Camera.Parametersparameters=camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPreviewSize(400,300);
camera.setParameters(parameters);
camera.startPreview();
publicvoidsurfaceDestroyed(SurfaceHolderholder){
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();
camera.release();
camera=null;
9、按键(只要重写dispoatchKeyEvent即可)
以下是屏蔽Home键的方法:
publicvoidonAttachedToWindow(){
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
10、音乐播放器
代码太多了,给个给力的连接吧!
publicclassMicActivityextendsActivityimplementsOnClickListener{
privatefinalstaticStringTAG="MicActivity";
privateButtonbtnMicR
privateButtonbtnMicP
privateButtonbtnMicF
privateTextViewtxtMicAmplitudeM
privateTextViewtxtMicTimeM
privateFilerecAudioF
privateMediaRecordermMediaR
privatestaticint
privatestaticintmic_state=MIC_STATE_RECORD;
privateThreadthreadA
privateThreadthreadT
privatestaticbooleanthreadR
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.mic);
setupViews();
protectedvoidonPause(){
super.onPause();
threadAmplitude=null;
threadTime=null;
privatevoidsetupViews(){
btnMicRecord=(Button)findViewById(R.id.mic_record);
btnMicPlay=(Button)findViewById(R.id.mic_play);
btnMicFinish=(Button)findViewById(R.id.mic_finish);
txtMicAmplitudeMsg=(TextView)findViewById(R.id.mic_amplitude_msg);
txtMicTimeMsg=(TextView)findViewById(R.id.mic_time_msg);
btnMicRecord.setOnClickListener(this);
btnMicPlay.setOnClickListener(this);
btnMicFinish.setOnClickListener(this);
res=getResources();
threadAmplitude=newThread(newUpdateAmplitude());
threadTime=newThread(newUpdateTime());
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.mic_record:
if(mic_state==MIC_STATE_RECORD){
btnMicRecord.setText(res.getString(R.string.mic_record_save_text));
mic_state=MIC_STATE_SAVE;
startRecorder();
}elseif(mic_state==MIC_STATE_SAVE){
btnMicRecord.setText(res.getString(R.string.mic_record_text));
btnMicRecord.setEnabled(false);
btnMicPlay.setEnabled(true);
mic_state=MIC_STATE_RECORD;
stopRecorder();
caseR.id.mic_play:
openFile(recAudioFile);
btnMicRecord.setEnabled(true);
btnMicFinish.setEnabled(true);
caseR.id.mic_finish:
newAlertDialog.Builder(MicActivity.this).setIcon(
R.drawable.icon).setTitle(res.getString(R.string.mic_title))
.setMessage(res.getString(R.string.mic_msg)).setPositiveButton(
res.getString(R.string.yes),dialogClick)
.setNegativeButton(res.getString(R.string.no),dialogClick).create().show();
privateandroid.content.DialogInterface.OnClickListenerdialogClick=newandroid.content.DialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhich){
switch(which){
caseDialogInterface.BUTTON_POSITIVE:
result(true);
caseDialogInterface.BUTTON_NEGATIVE:
result(false);
privatevoidresult(booleanflag){
Intentintent=newIntent(MicActivity.this,MainActivity.class);
intent.putExtra(MIC_RESULT,flag);
setResult(REQUESTCODE_MIC_RESULT,intent);
privateclassUpdateAmplitudeimplementsRunnable{
publicvoidrun(){
while(threadRun){
Messagemsg=newMessage();
msg.what=mMediaRecorder.getMaxAmplitude();
amplitudeHandler.sendMessage(msg);
Thread.sleep(250);
}catch(InterruptedExceptione){
e.printStackTrace();
privateHandleramplitudeHandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
Stringtext=String.format(res.getString(R.string.mic_status_amplitude),String.valueOf(msg.what));
txtMicAmplitudeMsg.setText(text);
privateclassUpdateTimeimplementsRunnable{
publicvoidrun(){
while(threadRun){
Thread.sleep(1000);
timeHandler.sendEmptyMessage(time);
}catch(InterruptedExceptione){
e.printStackTrace();
privateHandlertimeHandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
Stringtext=String.format(res.getString(R.string.mic_status_time),String.valueOf(msg.what));
txtMicTimeMsg.setText(text);
privatevoidstartRecorder(){
mMediaRecorder=newMediaRecorder();
recAudioFile=newFile("/mnt/flash","new.amr");
if(recAudioFile.exists()){
recAudioFile.delete();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setOutputFile(recAudioFile.getAbsolutePath());
mMediaRecorder.prepare();
}catch(IllegalStateExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
mMediaRecorder.start();
threadRun=true;
threadAmplitude.start();
threadTime.start();
privatevoidstopRecorder(){
threadRun=false;
if(recAudioFile!=null){
mMediaRecorder.stop();
mMediaRecorder.release();
privatevoidopenFile(Filef){
Intentintent=newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
Stringtype=getMIMEType(f);
intent.setDataAndType(Uri.fromFile(f),type);
startActivity(intent);
privateStringgetMIMEType(Filef){
Stringend=f.getName().substring(f.getName().lastIndexOf(".")+1,
f.getName().length()).toLowerCase();
Stringtype="";
if(end.equals("mp3")||end.equals("aac")||end.equals("aac")
||end.equals("amr")||end.equals("mpeg")||end.equals("mp4")){
type="audio";
}elseif(end.equals("jpg")||end.equals("gif")||end.equals("png")
||end.equals("jpeg")){
type="image";
type+="/*";
12、重力感应
publicclassMySensorEventListenerimplementsSensorEventListener{
privatebooleanisP
privateSaveMessagesaveM
publicMySensorEventListener(Contextcontext){
saveMessage=newSaveMessage(context);
publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){
publicvoidonSensorChanged(SensorEventevent){
if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
floatx=event.values[SensorManager.DATA_X];
floaty=event.values[SensorManager.DATA_Y];
floatz=event.values[SensorManager.DATA_Z];
isPass=x!=0||y!=0||z!=0;
System.out.println("Orientation-Seneor"+(isPass?"ok!"+"x="+x+"y="+y+"z="+z:"error!"));
saveMessage.setMessage(MSG_SENEOR,"Orientation-Seneor"+(isPass?"ok!"+"x="+x+"y="+y+"z="+z:"error!"));
}elseif(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
floatx=event.values[SensorManager.DATA_X];
floaty=event.values[SensorManager.DATA_Y];
floatz=event.values[SensorManager.DATA_Z];
isPass=x!=0||y!=0||z!=0;
System.out.println("Accelerometer-Seneor"+(isPass?"ok!"+"x="+x+"y="+y+"z="+z:"error!"));
saveMessage.setMessage(MSG_SENEOR,"Accelerometer-Seneor"+(isPass?"ok!"+"x="+x+"y="+y+"z="+z:"error!"));
浏览: 18179 次
//preview-size-values=, ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 音频输入接口 的文章

 

随机推荐