顯示網(wǎng)頁(yè):
城口網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
1. Uri uri = Uri.parse("");
2. Intent it = new Intent(Intent.ACTION_VIEWuri);
3. startActivity(it);123123
顯示地圖:
1. Uri uri = Uri.parse("geo:38.-77.");
2. Intent it = new Intent(Intent.Action_VIEWuri);
3. startActivity(it);123123
路徑規(guī)劃:
1. Uri uri = Uri.parse("");
2. Intent it = new Intent(Intent.ACTION_VIEWURI);
3. startActivity(it);123123
撥打電話:
調(diào)用撥號(hào)程序
1. Uri uri = Uri.parse("tel:xxxxxx");
2. Intent it = new Intent(Intent.ACTION_DIAL uri);
3. startActivity(it);
4. 1. Uri uri = Uri.parse("tel.xxxxxx");
2. Intent it =new Intent(Intent.ACTION_CALLuri);
3. 要運(yùn)用這個(gè)必須在配置文件中加入12345671234567
發(fā)送SMS/MMS
調(diào)用發(fā)送短信的程序
1. Intent it = new Intent(Intent.ACTION_VIEW);
2. it.putExtra("sms_body" "The SMS text");
3. it.setType("vnd.android-dir/mms-sms");
4. startActivity(it);1234512345
發(fā)送短信
1. Uri uri = Uri.parse("smsto:03");
2. Intent it = new Intent(Intent.ACTION_SENDTO uri);
3. it.putExtra("sms_body" "The SMS text");
4. startActivity(it);12341234
發(fā)送彩信
1. Uri uri = Uri.parse("content://media/external/images/media/23");
2. Intent it = new Intent(Intent.ACTION_SEND);
3. it.putExtra("sms_body" "some text");
4. it.putExtra(Intent.EXTRA_STREAM uri);
5. it.setType("image/png");
6. startActivity(it);123456123456
發(fā)送Email
1.
2. Uri uri = Uri.parse("mailto:");
3. Intent it = new Intent(Intent.ACTION_SENDTO uri);
4. startActivity(it);
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_EMAIL "");
3. it.putExtra(Intent.EXTRA_TEXT "The email body text");
4. it.setType("text/plain");
5. startActivity(Intent.createChooser(it "Choose Email Client"));
1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={""};
3. String[] ccs={""};
4. it.putExtra(Intent.EXTRA_EMAIL tos);
5. it.putExtra(Intent.EXTRA_CC ccs);
6. it.putExtra(Intent.EXTRA_TEXT "The email body text");
7. it.putExtra(Intent.EXTRA_SUBJECT "The email subject text");
8. it.setType("message/rfc822");
9. startActivity(Intent.createChooser(it "Choose Email Client"));12345678910111213141516171819201234567891011121314151617181920
添加附件
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_SUBJECT "The email subject text");
3. it.putExtra(Intent.EXTRA_STREAM "");
4. sendIntent.setType("audio/mp3");
5. startActivity(Intent.createChooser(it "Choose Email Client"));123456123456
播放多媒體
1.
2. Intent it = new Intent(Intent.ACTION_VIEW);
3. Uri uri = Uri.parse("");
4. it.setDataAndType(uri "audio/mp3");
5. startActivity(it);
1. Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI "1");
2. Intent it = new Intent(Intent.ACTION_VIEW uri);
3. startActivity(it);123456789123456789
Uninstall 程序
1. Uri uri = Uri.fromParts("package" strPackageName null);
2. Intent it = new Intent(Intent.ACTION_DELETE uri);
3. startActivity(it);12341234
* 安裝指定apk
*
進(jìn)入聯(lián)系人頁(yè)面
Intent intent=newIntent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);12341234
/檢查指定聯(lián)系人
Uri personUri=ContentUris.withAppendedId(People.CONTENT_URI info.id);//info.id聯(lián)系人ID
Intent intent=newIntent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);1234512345
調(diào)用系統(tǒng)安裝一個(gè)apk
Intent intent=newIntent();
intent.setDataAndType(Uri.parse()"application/vnd.android.package-archive");
startActivity(intent);123123
//調(diào)用相冊(cè)
public static final String MIME_TYPE_IMAGE_JPEG = "image/*";
public static final int ACTIVITY_GET_IMAGE = 0;
Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
getImage.addCategory(Intent.CATEGORY_OPENABLE);
getImage.setType(MIME_TYPE_IMAGE_JPEG);
startActivityForResult(getImage ACTIVITY_GET_IMAGE);12345671234567
//調(diào)用系統(tǒng)相機(jī)應(yīng)用程序,并存儲(chǔ)拍下來(lái)的照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
time = Calendar.getInstance().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue" time + ".jpg")));
startActivityForResult(intent ACTIVITY_GET_CAMERA_IMAGE);
@paramapkname apk名稱
publicvoidsetupAPK(String apkname){
String fileName=Environment.getExternalStorageDirectory()+"/"+apkname;
Intent intent=newIntent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(newFile(fileName))"application/vnd.android.package-archive");
mService.startActivity(intent);
}1234567891011121312345678910111213
AIDL-基本使用
AIDL-自定義數(shù)據(jù)類型
AIDL-修飾符in,out,inout
AIDL-重連方法
AIDL-接口注冊(cè)/解注冊(cè)
AIDL-連接池
為什么要特意講解一下接口的注冊(cè)與取消注冊(cè)呢,因?yàn)樵谑褂肁IDL進(jìn)程跨進(jìn)程通信的時(shí)候, 每次傳遞的接口對(duì)象在內(nèi)存中的地址都是不一樣的 ,所以在注冊(cè)了之后,無(wú)法使用常規(guī)的方式去取消, 因?yàn)樽?cè)和解注冊(cè)傳遞的接口地址都不一樣 ,系統(tǒng)無(wú)法識(shí)別
由于上面的問(wèn)題,AIDL中提供了一個(gè)專門解決上述情況的類 RemoteCallbackList ,其工作原理就是:
首先,在前面講解 AIDL的基本使用 的基礎(chǔ)上先增加新的AIDL接口以及注冊(cè)和解注冊(cè)方法:
然后就是 RemoteCallbackList 的使用方法了:
注冊(cè)/解注冊(cè)很簡(jiǎn)單
接著是使用接口的方式:
ps: 需要注意的是 beginBroadcast() 方法和 finishBroadcast() 方法 必須配合使用 ,哪怕只是簡(jiǎn)單的獲取集合大小
使用AIDL進(jìn)行跨進(jìn)程間通信中,往往我們是需要注冊(cè)監(jiān)聽(tīng),讓服務(wù)端通知的,但是服務(wù)端也必須提供解注冊(cè)的方法,不然客戶端如果離開(kāi)某個(gè)界面不想再接受消息了,雖然直接離開(kāi)不做處理客戶端這邊不會(huì)出錯(cuò),但是服務(wù)端那邊的監(jiān)聽(tīng)集合還存在之前的,那么就會(huì)浪費(fèi)系統(tǒng)資源,所以有注冊(cè)監(jiān)聽(tīng)的時(shí)候,最好也要實(shí)現(xiàn)解注冊(cè)的方法
《Android開(kāi)發(fā)藝術(shù)探索》
MediaCodec 是Android 4.1(api 16)版本引入的編解碼接口, Developer 官網(wǎng) 上描述的已經(jīng)很清楚了??梢耘浜?中文翻譯 一起看。理解更深刻。
MediaCodec的工作流程:
從上圖可以看出 MediaCodec 架構(gòu)上采用了2個(gè)緩沖區(qū)隊(duì)列,異步處理數(shù)據(jù),并且使用了一組輸入輸出緩存。
你請(qǐng)求或接收到一個(gè)空的輸入緩存(input buffer),向其中填充滿數(shù)據(jù)并將它傳遞給編解碼器處理。編解碼器處理完這些數(shù)據(jù)并將處理結(jié)果輸出至一個(gè)空的輸出緩存(output buffer)中。最終,你請(qǐng)求或接收到一個(gè)填充了結(jié)果數(shù)據(jù)的輸出緩存(output buffer),使用完其中的數(shù)據(jù),并將其釋放給編解碼器再次使用。
具體工作如下:
MediaCodec的基本調(diào)用流程是:
1.初始化MediaCodec,方法有兩種,分別是通過(guò)名稱和類型來(lái)創(chuàng)建,對(duì)應(yīng)的方法為:
2.配置編碼器,設(shè)置各種編碼器參數(shù)(MediaFormat),這個(gè)類包含了比特率、幀率、關(guān)鍵幀間隔時(shí)間等。然后再調(diào)用 mMediaCodec .configure,對(duì)于 API 19 以上的系統(tǒng),我們可以選擇 Surface 輸入:mMediaCodec .createInputSurface,
3.打開(kāi)編碼器,獲取輸入輸出緩沖區(qū)
獲取輸入輸出緩沖區(qū)在api19 上是以上方式獲取,api21以后 可以使用直接獲取ByteBuffer
4.輸入數(shù)據(jù),有2種方式,一種是普通輸入,一種是Surface 輸入
普通輸入又可區(qū)分為兩種情況,一種是配合MediaExtractor ,一種是取原數(shù)據(jù);
返回一個(gè)填充了有效數(shù)據(jù)的input buffer的索引,如果沒(méi)有可用的buffer則返回-1,參數(shù)為超時(shí)時(shí)間(TIMES_OUT),單位是微秒,當(dāng)timeoutUs==0時(shí),該方法立即返回;當(dāng)timeoutUs0時(shí),無(wú)限期地等待一個(gè)可用的input buffer,當(dāng)timeoutUs0時(shí),
等待時(shí)間為傳入的微秒值。
上面輸入緩存的index,通過(guò)getInputBuffers()得到的是輸入緩存數(shù)組,通過(guò)index和輸入緩存數(shù)組可以得到當(dāng)前請(qǐng)求的輸入緩存,在使用之前要clear一下,避免之前的緩存數(shù)據(jù)影響當(dāng)前數(shù)據(jù),接著就是把數(shù)據(jù)添加到輸入緩存中,并調(diào)用queueInputBuffer(...)把緩存數(shù)據(jù)入隊(duì);
5.輸出數(shù)據(jù)
通常編碼傳輸時(shí)每個(gè)關(guān)鍵幀頭部都需要帶上編碼配置數(shù)據(jù)(PPS,SPS),但 MediaCodec 會(huì)在首次輸出時(shí)專門輸出編碼配置數(shù)據(jù),后面的關(guān)鍵幀里是不攜帶這些數(shù)據(jù)的,所以需要我們手動(dòng)做一個(gè)拼接;
6.使用完MediaCodec后釋放資源
要告知編碼器我們要結(jié)束編碼,Surface 輸入的話調(diào)用 mMediaCodec .signalEndOfInputStream,普通輸入則可以為在 queueInputBuffer 時(shí)指定 MediaCodec.BUFFER_FLAG_END_OF_STREAM 這個(gè) flag;告知編碼器后我們就可以等到編碼器輸出的 buffer 帶著 MediaCodec.BUFFER_FLAG_END_OF_STREAM 這個(gè) flag 了,等到之后我們調(diào)用 mMediaCodec .release 銷毀編碼器
流控就是流量控制。 為什么要控制,就是為了在一定的限制條件下,收益最大化!
涉及到了 TCP 和視頻編碼:
對(duì) TCP 來(lái)說(shuō)就是控制單位時(shí)間內(nèi)發(fā)送數(shù)據(jù)包的數(shù)據(jù)量,對(duì)編碼來(lái)說(shuō)就是控制單位時(shí)間內(nèi)輸出數(shù)據(jù)的數(shù)據(jù)量。
TCP 的限制條件是網(wǎng)絡(luò)帶寬,流控就是在避免造成或者加劇網(wǎng)絡(luò)擁塞的前提下,盡可能利用網(wǎng)絡(luò)帶寬。帶寬夠、網(wǎng)絡(luò)好,我們就加快速度發(fā)送數(shù)據(jù)包,出現(xiàn)了延遲增大、丟包之后,就放慢發(fā)包的速度(因?yàn)槔^續(xù)高速發(fā)包,可能會(huì)加劇網(wǎng)絡(luò)擁塞,反而發(fā)得更慢)。
視頻編碼的限制條件最初是解碼器的能力,碼率太高就會(huì)無(wú)法解碼,后來(lái)隨著 codec 的發(fā)展,解碼能力不再是瓶頸,限制條件變成了傳輸帶寬/文件大小,我們希望在控制數(shù)據(jù)量的前提下,畫面質(zhì)量盡可能高。
一般編碼器都可以設(shè)置一個(gè)目標(biāo)碼率,但編碼器的實(shí)際輸出碼率不會(huì)完全符合設(shè)置,因?yàn)樵诰幋a過(guò)程中實(shí)際可以控制的并不是最終輸出的碼率,而是編碼過(guò)程中的一個(gè)量化參數(shù)(Quantization Parameter,QP),它和碼率并沒(méi)有固定的關(guān)系,而是取決于圖像內(nèi)容。 這一點(diǎn)不在這里展開(kāi),感興趣的朋友可以閱讀視頻壓縮編碼和音頻壓縮編碼的基本原理。
無(wú)論是要發(fā)送的 TCP 數(shù)據(jù)包,還是要編碼的圖像,都可能出現(xiàn)“尖峰”,也就是短時(shí)間內(nèi)出現(xiàn)較大的數(shù)據(jù)量。TCP 面對(duì)尖峰,可以選擇不為所動(dòng)(尤其是網(wǎng)絡(luò)已經(jīng)擁塞的時(shí)候),這沒(méi)有太大的問(wèn)題,但如果視頻編碼也對(duì)尖峰不為所動(dòng),那圖像質(zhì)量就會(huì)大打折扣了。如果有幾幀數(shù)據(jù)量特別大,但仍要把碼率控制在原來(lái)的水平,那勢(shì)必要損失更多的信息,因此圖像失真就會(huì)更嚴(yán)重。 這種情況通常的表現(xiàn)是畫面出現(xiàn)很多小方塊,看上去像是打了馬賽克一樣,導(dǎo)致畫面的局部或者整體看不清楚的情況
配置時(shí)指定目標(biāo)碼率和碼率控制模式:
碼率控制模式有三種:
碼率控制模式在 MediaCodecInfo.EncoderCapabilities 類中定義了三種,在 framework 層有另一套名字和它們的值一一對(duì)應(yīng):
動(dòng)態(tài)調(diào)整目標(biāo)碼率:
Android 流控策略選擇
下面展示使用MediaExtractor獲取數(shù)據(jù)后,用MediaMuxer重新寫成一個(gè)MP4文件的簡(jiǎn)單栗子
1. 多個(gè) Interface 可以同時(shí)被一個(gè)類繼承的特性可以彌補(bǔ) Java 單繼承的缺點(diǎn),增強(qiáng)其可擴(kuò)展性;
2. 定義公共接口和公共回調(diào)方法可以規(guī)范代碼;
抽象類:
含有abstract修飾符的class
即為抽象類,
abstract類不能創(chuàng)建實(shí)例對(duì)象,
含有abstract的方法的類必須定義為abstract
class
,
abstract
class
里的方法不必是抽象的,
抽象來(lái)中定義抽象方法必須放在具體子類中實(shí)現(xiàn),所以,不能有抽象的構(gòu)造方法或抽象的靜態(tài)方法,如果子類沒(méi)有實(shí)現(xiàn)抽象父類中的所有方法,那么,子類也必須定義為抽象類。
接口:
接口(interface)可以說(shuō)成是抽象類的特例。接口中的所有方法都必須是抽象的,接口中的方法定義默認(rèn)為public
abstract
。接口中的變量是全局常量,即public
static
final修飾的。
語(yǔ)法上的區(qū)別:
1,抽象類里可以有構(gòu)造方法,而接口內(nèi)不能有構(gòu)造方法。
2,抽象類中可以有普通成員變量,而接口中不能有普通成員變量。
3,抽象類中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的,不能有非抽象的普通方法。
4,抽象類中的抽象方法的訪問(wèn)類型可以是public
,protected和默認(rèn)類型,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public
abstract類型。
5,抽象類中可以包含靜態(tài)方法,接口內(nèi)不能包含靜態(tài)方法。
6,抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問(wèn)類型可以任意,但接口中定義的變量只能是public
static類型,并且默認(rèn)為public
static類型。
7,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。
再補(bǔ)充點(diǎn)兩者在應(yīng)用上的區(qū)別:
名稱欄目:android接口,Android接口
URL鏈接:http://sd-ha.com/article4/dsihcie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、搜索引擎優(yōu)化、網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、ChatGPT、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容