Android中Intent習(xí)慣用法
Android中的Intent是一個(gè)非常重要的類,如果對(duì)Intent不是特別了解,可以參見《詳解Android中Intent的使用方法》。如果對(duì)Intent Filter不是特別了解,可以參見《詳解Android中Intent對(duì)象與Intent Filter過濾匹配過程》。
本文著重講一下Android中一些常見的Intent的習(xí)慣用法,比如如何通過Intent發(fā)送短信、發(fā)送郵件、啟動(dòng)攝像機(jī)拍照錄視頻、設(shè)置鬧鈴、打開WIFI設(shè)置界面等等。
限于篇幅,本文分為上下兩篇,這是上篇。
發(fā)送短信
發(fā)送短信的時(shí)候,我們要使用的action是Intent.ACTION_SENDTO,并且要指定其URI是smsto:協(xié)議,這樣能保證是短信應(yīng)用接收并處理我們的intent對(duì)象,而不是其他應(yīng)用接收,從而準(zhǔn)確實(shí)現(xiàn)發(fā)送短信的目的。如果我們的action不是Intent.ACTION_SENDTO,而是Intent.ACTION_SEND,且沒有指定smsto:協(xié)議的URI的話,那么Android在接收到intent對(duì)象之后不會(huì)直接啟動(dòng)短信應(yīng)用,而是彈出了App Chooser,讓我們選擇要啟動(dòng)哪個(gè)應(yīng)用,比如電子郵件、QQ等等,所以為了確保直接啟動(dòng)短信應(yīng)用,我們應(yīng)該使用Intent.ACTION_SENDTO并且指定smsto:協(xié)議的URI。
示例代碼如下:
//使用ACTION_SENDTO而不是ACTION_SEND Intent intent = new Intent(Intent.ACTION_SENDTO); //指定URI使用smsto:協(xié)議,協(xié)議后面是接收短信的對(duì)象 Uri uri = Uri.parse("smsto:10086"); intent.setData(uri); //設(shè)置消息體 intent.putExtra("sms_body", "手頭有點(diǎn)緊,借點(diǎn)錢吧~~"); ComponentName componentName = intent.resolveActivity(getPackageManager()); if(componentName != null){ startActivity(intent); }
在構(gòu)造發(fā)送短信的URI時(shí),前面是smsto:協(xié)議,后面跟的是接收短信的對(duì)方的手機(jī)號(hào)。如果在構(gòu)建URI時(shí),只寫了smsto:,而沒有寫后面的手機(jī)的號(hào)的話,那么該intent也可以成功啟動(dòng)短信應(yīng)用,不過這種情形下,在啟動(dòng)了短信應(yīng)用之后,還需要我們自己再手動(dòng)輸入接收信息的手機(jī)號(hào)。我們通過key為sms_body的extra設(shè)置短信的內(nèi)容。
需要注意的是,在執(zhí)行了startActivity(intent)之后,雖然短信應(yīng)用啟動(dòng)了,但是短信沒有直接發(fā)出去,需要我們?cè)冱c(diǎn)擊一下發(fā)送消息才可以。
發(fā)送郵件
發(fā)送郵件的時(shí)候,我們要使用的action也是Intent.ACTION_SENDTO,并且要指定其URI是mailto:協(xié)議,這樣能保證是郵件應(yīng)用接收并處理我們的intent對(duì)象,而不是其他應(yīng)用接收,從而準(zhǔn)確實(shí)現(xiàn)發(fā)送郵件的目的。如果我們的action不是Intent.ACTION_SENDTO,而是Intent.ACTION_SEND,且沒有指定mailto:協(xié)議的URI的話,那么Android在接收到intent對(duì)象之后不會(huì)直接郵件應(yīng)用,而是彈出了App Chooser,讓我們選擇要啟動(dòng)哪個(gè)應(yīng)用,比如短信、QQ等等,所以為了確保直接啟動(dòng)郵件應(yīng)用,我們應(yīng)該使用Intent.ACTION_SENDTO并且指定mailto:協(xié)議的URI。
示例代碼如下:
//使用ACTION_SENDTO而不是ACTION_SEND Intent intent = new Intent(Intent.ACTION_SENDTO); //指定URI使用mailto:協(xié)議,確保只有郵件應(yīng)用能接收到此intent對(duì)象 Uri uri = Uri.parse("mailto:"); intent.setData(uri); String[] addresses = {"zhangsan@126.com", "lisi@126.com"}; String[] cc = {"boss@126.com"}; String[] bcc = {"girlfriend@126.com"}; String subject = "加班"; String content = "國(guó)慶正常上班~~"; //設(shè)置郵件的接收方 intent.putExtra(Intent.EXTRA_EMAIL, addresses); //設(shè)置郵件的抄送方 intent.putExtra(Intent.EXTRA_CC, cc); //設(shè)置郵件的密送方 intent.putExtra(Intent.EXTRA_BCC, bcc); //設(shè)置郵件標(biāo)題 intent.putExtra(Intent.EXTRA_SUBJECT, subject); //設(shè)置郵件內(nèi)容 intent.putExtra(Intent.EXTRA_TEXT, content); //設(shè)置郵件附件 //intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(...)); ComponentName componentName = intent.resolveActivity(getPackageManager()); if(componentName != null){ startActivity(intent); }
啟動(dòng)郵件應(yīng)用后的截圖如下所示:
我們分別通過key為Intent.EXTRA_EMAIL、Intent.EXTRA_CC和Intent.EXTRA_BCC的extra依次設(shè)置郵件的接收方、抄送方、密送方,其值均為String數(shù)組。我們通過key為Intent.EXTRA_SUBJECT的extra設(shè)置郵件標(biāo)題,通過key為Intent.EXTRA_TEXT的extra設(shè)置郵件內(nèi)容。如果想發(fā)送附件,那么可以將附件封裝成Uri的形式,然后通過key為Intent.EXTRA_STREAM的extra設(shè)置郵件附件。
需要注意的是,在執(zhí)行了startActivity(intent)之后,雖然郵件應(yīng)用啟動(dòng)打開了,但是郵件沒有直接發(fā)出去,需要我們?cè)冱c(diǎn)擊一下右上角的發(fā)送按鈕才能將郵件發(fā)出去。
打電話
要想通過Intent打電話,我們有兩個(gè)可以使用的action:Intent.ACTION_DIAL和Intent.ACTION_CALL,二者有一定的區(qū)別。
如果使用Intent.ACTION_DIAL作為intent對(duì)象的action,那么當(dāng)執(zhí)行startActivity(intent)之后,會(huì)啟動(dòng)打電話應(yīng)用,并且會(huì)自動(dòng)輸入指定的手機(jī)號(hào),但是不會(huì)自動(dòng)撥打,需要我們手動(dòng)按下?lián)艽虬粹o才能真正給對(duì)方打電話。
如果使用Intent.ACTION_CALL作為intent對(duì)象的action,那么當(dāng)執(zhí)行startActivity(intent)之后,會(huì)啟動(dòng)打電話應(yīng)用,并且直接撥打我們指定的手機(jī)號(hào),無需我們?cè)偈謩?dòng)按下?lián)艽虬粹o。但是需要注意的是,該action需要權(quán)限android.permission.CALL_PHONE,如果在應(yīng)用的AndroidManifest.xml文件中沒有添加該權(quán)限,那么當(dāng)指定到startActivity(intent)這句代碼的時(shí)候,就會(huì)拋出異常,應(yīng)用崩潰退出。
以下是示例代碼:
//Intent.ACTION_DIAL只撥號(hào),不打電話 //Intent intent = new Intent(Intent.ACTION_DIAL); //Intent.ACTION_CALL直接撥打指定電話,需要android.permission.CALL_PHONE權(quán)限 Intent intent = new Intent(Intent.ACTION_CALL); Uri uri = Uri.parse("tel:10086"); intent.setData(uri); ComponentName componentName = intent.resolveActivity(getPackageManager()); if(componentName != null){ startActivity(intent); }
在該示例代碼中,我們使用了Intent.ACTION_CALL作為intent對(duì)象的action,并且在AndroidManifest.xml中添加了如下權(quán)限:
我們使用tel:協(xié)議的URI,在協(xié)議后面的是要撥打的號(hào)碼,將該Uri作為intent對(duì)象的data。
拍照
要想通過Intent啟動(dòng)攝像機(jī)進(jìn)行拍照,我們需要設(shè)置intent對(duì)象的action值為MediaStore.ACTION_IMAGE_CAPTURE的action。然后我們用key為MediaStore.EXTRA_OUTPUT的extra設(shè)置圖片的輸出路徑,最后調(diào)用startActivityForResult()方法以啟動(dòng)攝像機(jī)應(yīng)用,并重寫我們的onActivityResult()以便在該方法中得知拍照完成。
示例代碼如下:
//表示用于拍照的requestCode private final int REQUEST_CODE_IMAGE_CAPTURE = 1; //我們存儲(chǔ)照片的輸出路徑,以便后續(xù)使用 private Uri imageOutputUri = null; //拍照 private void captureImage(){ PackageManager pm = getPackageManager(); //先判斷本機(jī)是否在硬件上有攝像能力 if(pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ComponentName componentName = intent.resolveActivity(pm); //判斷手機(jī)上有無攝像機(jī)應(yīng)用 if(componentName != null){ //創(chuàng)建圖片文件,以便于通過Uri.fromFile()生成對(duì)應(yīng)的Uri File imageFile = createImageFile(); if(imageFile != null){ //根據(jù)imageFile生成對(duì)應(yīng)的Uri imageOutputUri = Uri.fromFile(imageFile); //利用該Uri作為拍照完成后照片的存儲(chǔ)路徑,注意,一旦設(shè)置了存儲(chǔ)路徑,我們就不能獲取縮略圖了 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageOutputUri); //調(diào)用startActivityForResult()方法,以便在onActivityResult()方法中進(jìn)行相應(yīng)處理 startActivityForResult(intent, REQUEST_CODE_IMAGE_CAPTURE); }else{ Toast.makeText(this, "無法創(chuàng)建圖像文件!", Toast.LENGTH_LONG).show(); } }else{ Toast.makeText(this, "未在本機(jī)找到Camera應(yīng)用,無法拍照!", Toast.LENGTH_LONG).show(); } }else{ Toast.makeText(this, "本機(jī)沒有攝像頭,無法拍照!", Toast.LENGTH_LONG).show(); } } //創(chuàng)建圖片文件,以便于通過Uri.fromFile()生成對(duì)應(yīng)的Uri private File createImageFile(){ File image = null; //用時(shí)間戳拼接文件名稱,防止文件重名 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); try{ image = File.createTempFile( imageFileName, //前綴 ".jpg", //后綴 storageDir //文件夾 ); }catch (IOException e){ image = null; e.printStackTrace(); Log.e("DemoLog", e.getMessage()); } return image; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { //首先判斷是否正確完成 if(resultCode == RESULT_OK){ switch (requestCode){ case REQUEST_CODE_IMAGE_CAPTURE: //此處,我們可以通過imageOutputUri獲取到我們想要的圖片 String imagePath = imageOutputUri.toString(); Log.i("DemoLog", "照片路徑是: " + imagePath); Toast.makeText(this, "照片路徑是: " + imagePath, Toast.LENGTH_LONG).show(); //以下代碼嘗試獲取縮略圖 //如果設(shè)置MediaStore.EXTRA_OUTPUT作為extra的時(shí)候,那么此處的intent為null,需要判斷 if(intent != null){ Bitmap thumbnail = intent.getParcelableExtra("data"); //有的手機(jī)并不會(huì)給拍照的圖片生成縮略圖,所以此處也要判斷 if(thumbnail != null){ Log.i("DemoLog", "得到縮略圖"); } } default: break; } } }
我們分析一下上面的代碼片段:
不是所有的Android設(shè)備都能拍照的,所以首先我們調(diào)用了PackageManager的hasSystemFeature(PackageManager.FEATURE_CAMERA)方法,判斷當(dāng)前設(shè)備在硬件層級(jí)是否具有拍照的能力。
然后我們創(chuàng)建了一個(gè)action為MediaStore.ACTION_IMAGE_CAPTURE的intent對(duì)象。
然后我們通過調(diào)用intent.resolveActivity(pm)方法判斷當(dāng)前設(shè)備有無攝像機(jī)應(yīng)用以便我們啟動(dòng)。如果沒有攝像機(jī)應(yīng)用但是我們卻把intent對(duì)象傳遞給startActivity()或startActivityForResult()的話,就會(huì)拋出異常,應(yīng)用崩潰退出。
我們自己寫了一個(gè)createImageFile方法,通過該方法我們?cè)谧约旱膽?yīng)用所對(duì)應(yīng)的外設(shè)存儲(chǔ)卡上創(chuàng)建了一個(gè)圖片文件。需要注意的是,此步驟需要WRITE_EXTERNAL_STORAGE權(quán)限,在AndroidManifest.xml中注冊(cè)如下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"></uses-permission>
我們利用上面生成的圖片文件生成了對(duì)應(yīng)的Uri,將其存儲(chǔ)在Activity中類型為Uri的字段imageOutputUri中,之后我們執(zhí)行了intent.putExtra(MediaStore.EXTRA_OUTPUT, imageOutputUri),利用該Uri作為拍照完成后照片的存儲(chǔ)路徑。
此處需要特別注意的是,一旦設(shè)置了存儲(chǔ)路徑,我們就不能在onActivityResult()中獲取縮略圖了。
最后我們需要調(diào)用方法startActivityForResult(intent, REQUEST_CODE_IMAGE_CAPTURE)以啟動(dòng)攝像機(jī)應(yīng)用進(jìn)行拍照,其中REQUEST_CODE_IMAGE_CAPTURE是我們自定義指定的用于拍照的requestCode。
我們覆寫了onActivityResult方法,拍照完成后觸發(fā)該方法的執(zhí)行。首先我們要判斷resultCode是否與RESULT_OK相等,只有相等才表明拍照成功,然后我們判斷如果requestCode是否等于REQUEST_CODE_IMAGE_CAPTURE,若相等表明是拍照返回的結(jié)果。那么此時(shí),我們就可以通過我們之前存儲(chǔ)的imageOutputUri獲取剛剛拍完的照片了,其URI字符串如:
file:///storage/sdcard0/Android/data/com.ispring.commonintents/files/Pictures/JPEG_20150919_112704_533002075.jpg
需要注意的是,如果我們?cè)诘?步之中設(shè)置MediaStore.EXTRA_OUTPUT作為照片輸出路徑的話,那么在onActivityResult中無法獲取從攝像機(jī)應(yīng)用換回的Intent,即為null,這樣也就無法獲取縮略圖。反之,如果在第5步?jīng)]有設(shè)置MediaStore.EXTRA_OUTPUT作為照片輸出路徑的話,intent不為空,可以嘗試執(zhí)行Bitmap thumbnail = intent.getParcelableExtra("data")獲取縮略圖,如果thumbnail不為空,表示能成功獲取縮略圖。但是有的手機(jī)并不會(huì)給拍照的圖片生成縮略圖,所以此處的thumbnail也有可能是null,所以在使用之前要先判斷。
攝像
通過Intent啟動(dòng)攝像機(jī)進(jìn)行攝像的步驟與上面剛提到的通過Intent啟動(dòng)攝像機(jī)進(jìn)行拍照的步驟非常相似,稍有區(qū)別。要啟動(dòng)Camera進(jìn)行攝像,我們需要給intent設(shè)置值為MediaStore.ACTION_VIDEO_CAPTURE的action,然后我們用key為MediaStore.EXTRA_OUTPUT的extra設(shè)置圖片的輸出路徑,最后調(diào)用startActivityForResult()方法以啟動(dòng)攝像機(jī)應(yīng)用,并重寫我們的onActivityResult()以便在該方法中得知攝像完成。
以下是示例代碼:
//表示用于錄視頻的requestCode private final int REQUEST_CODE_VIDEO_CAPTURE = 2; //我們存儲(chǔ)視頻的輸出路徑,以便后續(xù)使用 private Uri videoOutputUri = null; //攝像 private void captureVideo(){ PackageManager pm = getPackageManager(); //先判斷本機(jī)是否在硬件上有攝像能力 if(pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)){ //將intent的action設(shè)置為MediaStore.ACTION_VIDEO_CAPTURE Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); ComponentName componentName = intent.resolveActivity(pm); //判斷手機(jī)上有無攝像機(jī)應(yīng)用 if(componentName != null){ //創(chuàng)建視頻文件,以便于通過Uri.fromFile()生成對(duì)應(yīng)的Uri File videoFile = createVideoFile(); if(videoFile != null){ //根據(jù)videoFile生成對(duì)應(yīng)的Uri videoOutputUri = Uri.fromFile(videoFile); //利用該Uri作為攝像完成后視頻的存儲(chǔ)路徑 intent.putExtra(MediaStore.EXTRA_OUTPUT, videoOutputUri); //調(diào)用startActivityForResult()方法,以便在onActivityResult()方法中進(jìn)行相應(yīng)處理 startActivityForResult(intent, REQUEST_CODE_VIDEO_CAPTURE); }else{ Toast.makeText(this, "無法創(chuàng)建視頻文件!", Toast.LENGTH_LONG).show(); } }else{ Toast.makeText(this, "未在本機(jī)找到Camera應(yīng)用,無法攝像!", Toast.LENGTH_LONG).show(); } }else{ Toast.makeText(this, "本機(jī)沒有攝像頭,無法攝像!", Toast.LENGTH_LONG).show(); } } //創(chuàng)建視頻文件,以便于通過Uri.fromFile()生成對(duì)應(yīng)的Uri private File createVideoFile(){ File videoFile = null; //用時(shí)間戳拼接文件名稱,防止文件重名 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "MP4" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES); try{ videoFile = File.createTempFile( imageFileName, //前綴 ".mp4", //后綴 storageDir //文件夾 ); }catch (IOException e){ videoFile = null; e.printStackTrace(); Log.e("DemoLog", e.getMessage()); } return videoFile; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { //首先判斷是否正確完成 if(resultCode == RESULT_OK){ switch (requestCode){ case REQUEST_CODE_VIDEO_CAPTURE: //如果設(shè)置MediaStore.EXTRA_OUTPUT作為extra的時(shí)候, //在有的手機(jī)上,此處的intent為不為null,但是在有的手機(jī)上卻為null, //所以不建議從intent.getData()中獲取視頻路徑 //我們應(yīng)該自己記錄videoOutputUri來得知視頻路徑,下面注釋的代碼不建議使用 /*if(intent != null){ Uri videoUri = intent.getData(); if(videoUri != null){ //路徑格式如content://media/external/video/media/130025 Log.i("DemoLog", "視頻路徑是: " + videoUri.toString()); } }*/ String videoPath = videoOutputUri.toString(); //1.如果沒有設(shè)置MediaStore.EXTRA_OUTPUT作為視頻文件存儲(chǔ)路徑,那么路徑格式如下所示: // 路徑格式如content://media/external/video/media/130025 //2.如果設(shè)置了MediaStore.EXTRA_OUTPUT作為視頻文件存儲(chǔ)路徑,那么路徑格式如下所示: // 路徑格式如file:///storage/sdcard0/Android/data/com.ispring.commonintents/files/Movies/MP420150919_184132_533002075.mp4 Log.i("DemoLog", "視頻路徑是: " + videoPath); Toast.makeText(this, "視頻路徑是: " + videoPath, Toast.LENGTH_LONG).show(); break; default: break; } } }
可以看到上面啟動(dòng)Camera攝像的代碼與拍照的代碼幾乎完全一樣,具體解釋參見對(duì)拍照代碼的描述。在該示例代碼中,我們通過MediaStore.EXTRA_OUTPUT設(shè)置了視頻的存放路徑,拍照的時(shí)候我們也通過它設(shè)置了照片的輸出路徑,但是二者稍有區(qū)別:
- 1. 對(duì)于拍照,設(shè)置了MediaStore.EXTRA_OUTPUT之后,onActivityResult中的Intent參數(shù)是null,不能從Intent中得知照片的存儲(chǔ)路徑。
- 2. 對(duì)于攝像,設(shè)置了MediaStore.EXTRA_OUTPUT之后,onActivityResult中的Intent參數(shù)在有的手機(jī)上是null,但是在有的手機(jī)上不是null,我的手機(jī)小米1s得到的intent對(duì)象就不是null,所以此處很奇怪。如果intent不是null,可以通過intent.getData()獲取到視頻文件的存儲(chǔ)路徑,但是由于intent是否為null不確定,所以盡量不要通過intent.getData()方法獲取其路徑,而應(yīng)該自己在Activity中存儲(chǔ)一個(gè)字段保存我們之前設(shè)置的文件路徑,這樣就沒問題了。
以上就是關(guān)于Android中常見Intent習(xí)慣用法,希望對(duì)大家的學(xué)習(xí)有所幫助。
- Android開發(fā)筆記之Intent初級(jí)學(xué)習(xí)教程
- Android開發(fā)中Intent傳遞對(duì)象的方法分析
- Android中Intent傳遞對(duì)象的兩種方法Serializable,Parcelable
- Android中使用Intent在Activity之間傳遞對(duì)象(使用Serializable或者Parcelable)的方法
- Android編程使用Intent傳遞對(duì)象的方法分析
- Android使用Intent啟動(dòng)其他非系統(tǒng)應(yīng)用程序的方法
- 詳解Android中Intent對(duì)象與Intent Filter過濾匹配過程
- 詳解Android中Intent的使用方法
- 詳解Android中IntentService的使用方法
- 深入學(xué)習(xí)Android中的Intent
- Android 廣播大全 Intent Action 事件詳解
- Android編程開發(fā)之打開文件的Intent及使用方法
- Android之Intent附加數(shù)據(jù)的兩種實(shí)現(xiàn)方法
- 從源碼剖析Android中的Intent組件
相關(guān)文章
Android RecyclerView藝術(shù)般的控件使用完全解析
這篇文章主要介紹了Android RecyclerView藝術(shù)般的控件使用完全解析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07利用smsmanager實(shí)現(xiàn)后臺(tái)發(fā)送短信示例
這篇文章主要介紹了android利用SmsManager可以實(shí)現(xiàn)后臺(tái)發(fā)送短信的方法,最近有使用說明,大家可以參考使用2014-01-01Android自定義實(shí)現(xiàn)一個(gè)省份簡(jiǎn)稱鍵盤
這篇文章主要為大家詳細(xì)介紹了Android如何自定義實(shí)現(xiàn)一個(gè)省份簡(jiǎn)稱鍵盤,可以用在車牌輸入等地方,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06詳解Android更改APP語言模式的實(shí)現(xiàn)過程
本文詳細(xì)介紹如何更改Android中APP的語言模式,這個(gè)功能對(duì)于大家開發(fā)Android APP很有幫助,本文運(yùn)用文字介紹和代碼示例把過程寫的很詳細(xì),有需要的可以參考借鑒。2016-08-08Android自定義View軟鍵盤實(shí)現(xiàn)搜索
本文給大家分享android自定義view軟鍵盤實(shí)現(xiàn)搜索,對(duì)android軟鍵盤相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12Android聊天工具基于socket實(shí)現(xiàn)
這篇文章主要介紹了基于socket實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的Android聊天工具,實(shí)現(xiàn)方法簡(jiǎn)單,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2016-02-02Flutter 實(shí)現(xiàn)虎牙/斗魚 彈幕功能
這篇文章主要介紹了Flutter 實(shí)現(xiàn)虎牙/斗魚 彈幕功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04