Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android官方文檔之App Components(Common Intents)

Android官方文檔之App Components(Common Intents)

編輯:關於Android編程

Intent的真正強大之處在於它的隱式Intent,隱式Intent需要配合Intent-filters使用,有關這方面的概念和知識,您可以參考我翻譯的官方文檔:《Android官方文檔之App Components(Intents and Intent Filters)》。


隱式Intent足夠強大,以至於系統提供了大量的Intent方便開發者啟動系統應用程序,本文將介紹一些常用的隱式Intent、以及如何自定義intent-filters以匹配隱式intent。


如需閱讀官方原文,您可以點擊這個鏈接:《Common Intents》


常用的Intent(Common Intents)

下面將按照啟動的目標組件類別介紹隱式Intent:


鬧鐘類別(Alarm Clock)


啟動鬧鐘(Create an alarm)

要啟動鬧鐘activity,可以這樣設定Intent:

Action:ACTION_SET_ALARM

Data URI:空

MIME Type:空

Extras:

EXTRA_HOUR:設定小時

EXTRA_MINUTES:設定分鐘

EXTRA_MESSAGE:設定自定義消息

EXTRA_DAYS:設定每周的周幾重復響鈴。該字段的值應定義成ArrayList,每個元素是Calendar類中的靜態字段(如Calendar.Monday)。對於那些一次性響鈴,無需設置這個extra。

EXTRA_RINGTONE:設定鬧鐘鈴聲。該字段的值應設定成一個scheme為 content: 的URI類型,該URI指向了一個音頻文件的地址;您也可以將值設定為 VALUE_RINGTONE_SILENT,這表示將鬧鐘設為靜音。

EXTRA_VIBRATE:設定是否響鈴的同時震動。該字段的值為boolean類型。

EXTRA_SKIP_UI:設定啟動系統鬧鐘應用程序時,是否跳過UI界面,值為boolean類型,若為true,表示不顯示設定鬧鐘的dialog對話框,而直接進入設置鬧鐘的activity。


示例:

public void createAlarm(String message, int hour, int minutes) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_HOUR, hour)
            .putExtra(AlarmClock.EXTRA_MINUTES, minutes);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

若為Intent指定的action為ACTION_SET_ALARM,則需要在manifest中配置如下權限:


可以響應該Intent的intent-filter如下:


    
        
        
    

啟動計時器(Create a timer)

!請注意:該Intent只兼容 Android 4.4 (API level 19) 及以上版本的設備。


要啟動計時器,可以這樣設定Intent:

Action:ACTION_SET_TIMER

Data URI:空

MIME Type:空

Extras:

EXTRA_LENGTH:設置倒計時的秒數

EXTRA_MESSAGE:設置到時消息

EXTRA_SKIP_UI:設定啟動系統計時器應用程序時,是否跳過UI界面,值為boolean類型,若為true,表示不顯示設定計時器的設置dialog對話框,而直接進入計時器的activity。


示例:

public void startTimer(String message, int seconds) {
    Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

若為Intent指定的action為ACTION_SET_TIMER,則需要在manifest中配置如下權限:


可以響應該Intent的intent-filter如下:


    
        
        
    

顯示設置的所有鬧鐘(Show all alarms)

!請注意:該Intent只兼容 Android 4.4 (API level 19) 及以上版本的設備。


Action:ACTION_SHOW_ALARMS

Data URI:空

MIME Type:空


示例:


    
        
        
    

日期類別(Calendar)


添加日歷事件(Add a calendar event)


Action:ACTION_INSERT

Data URI:Events.CONTENT_URI

MIME Type:”vnd.android.cursor.dir/event”

Extras:

EXTRA_EVENT_ALL_DAY:該鍵所對應的值是boolean類型,表示事件是否為全天候事件。

EXTRA_EVENT_BEGIN_TIME:代表事件的起始時間,值為 從2000年到設定起始時間所經歷的毫秒數(milliseconds since epoch)。

EXTRA_EVENT_END_TIME :代表事件的結束時間,值為 從2000年到設定結束時間所經歷的毫秒數(milliseconds since epoch)。

TITLE:事件的標題

DESCRIPTION:事件的描述

EVENT_LOCATION:事件發生的地點

EXTRA_EMAIL:將事件郵件的形式發送,值為郵箱地址,可同時發送給多人,郵箱地址以逗號分隔。欲了解更多關於發送郵件的細節,您可以參考這個類:CalendarContract.EventsColumns


示例:

public void addEvent(String title, String location, Calendar begin, Calendar end) {
    Intent intent = new Intent(Intent.ACTION_INSERT)
            .setData(Events.CONTENT_URI)
            .putExtra(Events.TITLE, title)
            .putExtra(Events.EVENT_LOCATION, location)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

可以匹配上述intent的intent-filters:


    
        
        
        
    

相機類別(Camera)


使用相機拍照或錄像並返回結果(Capture a picture or video and return it)


Action:ACTION_IMAGE_CAPTURE 或 ACTION_VIDEO_CAPTURE

Data URI Scheme:空

MIME Type:空

Extras:EXTRA_OUTPUT,該鍵所對應的值是一個Uri對象,它表示通過相機應用所照的相片或錄的視頻的存儲地址。您可以在onActivityResult()方法中通過該Uri獲取剛照的相片。

!請注意:通過ACTION_IMAGE_CAPTURE啟動activity並返回的照片是一個鍵為”data”的Bitmap類型的略縮圖(downscaled copy (a thumbnail) of the photo)

示例如下:

static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri mLocationForPhotos;

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(mLocationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        // Do other work with full size photo saved in mLocationForPhotos
        ...
    }
}

關於如何通過這個Intent拍照、錄像,以及如何獲得存儲照片、錄像的Uri地址,您可以參考這些Training:

Taking Photos Simply

Taking Videos Simply


示例intent-filter:


    
        
        
    

啟動相機應用的照相模式(Start a camera app in still image mode)


Action:INTENT_ACTION_STILL_IMAGE_CAMERA

Data URI Scheme:空

MIME Type:空

Extras:空


示例:

public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent);
    }
}

intent-filter:


    
        
        
    

啟動相機應用的錄像模式(Start a camera app in video mode)


Action:INTENT_ACTION_VIDEO_CAMERA

Data URI Scheme:空

MIME Type:空

Extras:空


示例:

public void capturePhoto() {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent);
    }
}

intent-filter:


    
        
        
    

通訊錄類別(Contacts/People App)


選擇聯系人(Select a contact)


在onActivityResult()中可獲取您選擇的聯系人,如果只是通過Contacts Provider讀取聯系人信息,則無需申請READ_CONTACTS權限。


Action:ACTION_PICK

Data URI Scheme:None

MIME Type:Contacts.CONTENT_TYPE


示例:

static final int REQUEST_SELECT_CONTACT = 1;

public void selectContact() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_CONTACT);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
        Uri contactUri = data.getData();
        // Do something with the selected contact at contactUri
        ...
    }
}

關於如何處理返回的Uri對象contactUri ,您可以訪問這個Training:Retrieving Details for a Contact


獲得具體聯系人信息(Select specific contact data)


Action:ACTION_PICK

Data URI Scheme:空

MIME Type:

CommonDataKinds.Phone.CONTENT_TYPE,表示獲取聯系人號碼

CommonDataKinds.Email.CONTENT_TYPE,表示獲取聯系人Email

CommonDataKinds.StructuredPostal.CONTENT_TYPE,表示獲取聯系人的郵寄地址

通過ContactsContract.CommonDataKinds中的其他字段,還可以獲取更多聯系人信息。

示例:

static final int REQUEST_SELECT_PHONE_NUMBER = 1;

public void selectContact() {
    // Start an activity for the user to pick a phone number from contacts
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
        // Get the URI and query the content provider for the phone number
        Uri contactUri = data.getData();
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);
        // If the cursor returned is valid, get the phone number
        if (cursor != null && cursor.moveToFirst()) {
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            // Do something with the phone number
            ...
        }
    }
}

查看聯系人(View a contact)

Action:ACTION_VIEW

Data URI Scheme:content:,該Uri指向了查看的聯系人地址,有兩種方法可獲得該Uri:

通過上一小節的ACTION_PICK,獲得返回的Uri。此方式無需申請權限。

直接檢索通訊錄聯系人( Retrieving a List of Contacts)。此方式需要READ_CONTACTS權限。

MIME Type:空


示例:

public void viewContact(Uri contactUri) {
    Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

編輯聯系人信息(Edit an existing contact)


Action:ACTION_EDIT

Data URI Scheme:content:,獲取該Uri的方式和權限與上一小節的獲取方式一致。

MIME Type:由Uri決定。

Extras:ContactsContract.Intents.Insert


示例:

public void editContact(Uri contactUri, String email) {
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setData(contactUri);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

更多關於編輯聯系人的方法,您可以參考這個Training:Modifying Contacts Using Intents。


新增聯系人(Insert a contact)


Action:ACTION_INSERT

Data URI Scheme:空

MIME Type:Contacts.CONTENT_TYPE

Extras:ContactsContract.Intents.Insert


示例:

public void insertContact(String name, String email) {
    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setType(Contacts.CONTENT_TYPE);
    intent.putExtra(Intents.Insert.NAME, name);
    intent.putExtra(Intents.Insert.EMAIL, email);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Email類別(Email)

發送郵件並可選攜帶附件(Compose an email with optional attachments)

Action:

ACTION_SENDTO。用於發送不帶附件的Email(for no attachment)

ACTION_SEND。用於發送帶一個附件的Email(for one attachment)

ACTION_SEND_MULTIPLE。用於發送多個附件的Email(for multiple attachments)

Data URI Scheme:空

MIME Type:

"text/plain"

"*/*"

Extras:

Intent.EXTRA_EMAIL:該鍵所對應值為一個字符串數組,每個字符串表示一個收件人的地址。

Intent.EXTRA_CC:該鍵所對應值為一個字符串數組,每個字符串表示一個副本抄送地址(CC= Carbon Copy)。

Intent.EXTRA_BCC:該鍵所對應值為一個字符串數組,每個字符串表示一個密件抄送地址(BCC= Blind Carbon Copy)。

Intent.EXTRA_SUBJECT:該鍵所對應值為一個字符串,表示郵件主題。

Intent.EXTRA_TEXT:該鍵所對應值為一個字符串,表示郵件內容。

Intent.EXTRA_STREAM:該鍵所對應值為一個Uri地址,該Uri指向了添加的附件,若action為 ACTION _SEND _MULTIPLE,則值應為ArrayList,每個元素為一個Uri對象。


示例:

public void composeEmail(String[] addresses, String subject, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

若您能確定通過該隱式Intent能啟動一個郵件應用的activity(而不是社交類應用或是編輯短信的應用),那麼您可以使用action為ACTION_SENDTO並且使用”mailto”作為Uri的解析字符串發送郵件:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Intent-filter:


    
        
        
        
    
    
        
        
        
    

文件存儲類別(File Storage)


檢索特定類型的文件(Retrieve a specific type of file)


為了能夠獲取用戶選擇文件的引用(如一張照片、一個文檔),可以使用ACTION_GET_CONTENT這個action,並指定期望的MIME類型。而返回的文件的引用僅短暫存在於activity的生命周期中,若希望較持久化的保存文件,程序需要將引用指向的文件復制一份並保留下來。該Intent同時允許在此進程中新建文件。
通過回調方法onActivityResult(),可以獲得回傳的Intent對像,該對象包含了用戶選擇文件的Uri地址,該Uri地址的scheme可以是任何類型,比如可以是http:content:file:;如果您僅希望用戶檢索的文件來自於ContentProvider(也就是Uri的scheme為content:類型),並通過openFileDescriptor()方法獲得文件流,那麼需要為Intent中加入CATEGORY_OPENABLE的category。
若設備版本為Android 4.3 (API level 18)及以上,您還可以通過為Intent添加鍵為EXTRA_ALLOW_MULTIPLE,值為true的extra,來同時選擇多個文件,並通過Intent.getClipData()方法返回ClipData對象來獲取其中包含的多個文件。


Action:ACTION_GET_CONTENT

Data URI Scheme:空

MIME Type:該類型由用戶選擇的文件類型決定。

Extras:

EXTRA_ALLOW_MULTIPLE。該鍵對應的值為boolean類型,設置用戶是否可一次性選擇多個文件。 EXTRA_LOCAL_ONLY:該鍵對應的值為boolean類型,表示所選文件是否為本地文件(即是否可以在用戶選擇文件後立刻返回並獲得該文件,而不是還需要去開啟一個服務下載)。
Category (可選):CATEGORY_OPENABLE,選擇的文件是“可打開”的文件(”openable” files),並可通過openFileDescriptor()方法獲取該文件的文件流。

下例演示了如何通過Intent獲取一張圖片:

static final int REQUEST_IMAGE_GET = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        Uri fullPhotoUri = data.getData();
        // Do work with photo saved at fullPhotoUri
        ...
    }
}

匹配的Intent-filter:


    
        
        
        
        
        
    

打開一個特定類型的文件(Open a specific type of file)


當SDK版本為Android 4.4 或以上時,可以通過ACTION_OPEN_DOCUMENT這個action及特定的MIME類型打開一個其他應用的文件並管理它,您還可以通過ACTION_CREATE_DOCUMENT這個action來寫入一個文件。


Action:ACTION_OPEN_DOCUMENT 或 ACTION_CREATE_DOCUMENT

Data URI Scheme:空

MIME Type:由用戶選擇的文件類型確定

Extras:

EXTRA_MIME_TYPES,對應值是一個請求文件類型的MIME類型數組,必須最少指定類型為"*/*"。 EXTRA_ALLOW_MULTIPLE,對應值是一個boolean類型,用戶設置用戶是否每次可同時選擇多個文件。 EXTRA_TITLE,對應著ACTION_CREATE_DOCUMENT這個action,為新建的文件起一個標題。 EXTRA_LOCAL_ONLY,對應值為boolean類型,用於設定選擇的文件是否來自本地(即選擇文件後是否可立即返回)。
Category:CATEGORY_OPENABLE。返回可打開的文件並可通過openFileDescriptor()方法表示成文件流形式。

示例:

static final int REQUEST_IMAGE_OPEN = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
        Uri fullPhotoUri = data.getData();
        // Do work with full size photo saved at fullPhotoUri
        ...
    }
}

為了讓第三方APP也能識別ACTION_OPEN_DOCUMENT這個action,徐這樣配置ContentProvider:


    
        
    

地圖類別(Maps)


在地圖上定位(Show a location on a map)


Action:ACTION_VIEW

Data URI Scheme:

geo:latitude,longitude:在地圖上顯示指定的位置,如:"geo:47.6,-122.3"

geo:latitude,longitude?z=zoom:在地圖上按一定的放大級別顯示指定的位置,1表示最遠,顯示的是全球地圖,中心點在是給定的經緯度;23表示最接近地面(closest) 。如:"geo:47.6,-122.3?z=11"

geo:0,0?q=lat,lng(label):顯示指定的位置並顯示一個label。如:"geo:0,0?q=34.99,-106.61(Treasure)"

geo:0,0?q=my+street+address:在地圖上顯示指定的某個地址的位置。如:"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
!注意:由geo開頭的Uri所解析的字符串參數必須被編碼,例如字符串"1st & Pike, Seattle"所表示的地址應被編碼為"1st%20%26%20Pike%2C%20Seattle",才能傳入Uri.parse()方法中,其中字符串中的空格應被編碼成%20或者加號( + )


MIME Type:空

示例:

public void showMap(Uri geoLocation) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(geoLocation);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

匹配的intent-filter:


    
        
        
        
    

音樂和錄像類別(Music or Video)


播放一個多媒體文件(Play a media file)

Action:ACTION_VIEW

Data URI Scheme:

file:

content:

http:

MIME Type:

"audio/*"

"application/x-ogg"

"application/itunes"


示例:

public void playMedia(Uri file) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(file);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

匹配的intent-filter:


    
        
        
        
        
    

備忘錄類別(New Note)


創建一個備忘錄(Create a note)


Action:ACTION_CREATE_NOTE

Data URI Scheme:空

MIME Type:

PLAIN_TEXT_TYPE

"*/*"

Extras:

EXTRA_NAME ,表示備忘錄的標題

EXTRA_TEXT,表示備忘錄的內容


示例:

public void createNote(String subject, String text) {
    Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE)
            .putExtra(NoteIntents.EXTRA_NAME, subject)
            .putExtra(NoteIntents.EXTRA_TEXT, text);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

匹配的intent-filter:


    
        
        
        
    

電話類別(Phone)


初始化電話撥號(Initiate a phone call)


您可以通過 ACTION_DIAL這個action打開電話應用程序的撥號界面,並把電話號碼作為參數到撥號框中,用戶點擊“撥打”按鈕開始撥號。這無需任何權限。

您也可以通過ACTION_CALL這個action直接撥打電話,而無需點擊“撥打”按鈕。這需要添加如下權限:

Intent的具體設置方式如下:


Action:

ACTION_DIAL,打開撥號界面。

ACTION_CALL,直接撥打電話。

Data URI Scheme:

tel:

voicemail:

MIME Type:空


合法的電話號碼格式請參照這個鏈接:the IETF RFC 3966。合法的電話號碼形如:

tel:2125551212

tel:(212) 555 1212


示例:

public void dialPhoneNumber(String phoneNumber) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

搜索類別(Search)


搜索特定的app(Search using a specific app)


Action:"com.google.android.gms.actions.SEARCH_ACTION",,支持通過Google Now 語音搜索。

Extras:QUERY,該鍵對應值是一個字符串,表示用戶輸入的搜索信息。


如希望自己的應用程序可以被搜索到,可以在intent-filter中按如下方式配置:


    
        
        
    


Action:ACTION_WEB_SEARCH

Data URI Scheme:空

MIME Type:空

Extras:SearchManager.QUERY。一個字符串,表示搜索的內容。


示例:

public void searchWeb(String query) {
    Intent intent = new Intent(Intent.ACTION_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

設置類別(Settings)


打開某個設置選項(Open a specific section of Settings)


您可能需要在使用app的過程中調整某些系統設置,以便更好地使用應用(比如應用需要開啟藍牙功能以便傳輸文件,這時app可以跳轉至系統設置的藍牙開關選項中,引導用戶開啟藍牙功能)。您只需要在Intent中添加需要下列action,就能跳轉至相應的設置界面。


Action:

ACTION_SETTINGS

ACTION_WIRELESS_SETTINGS

ACTION_AIRPLANE_MODE_SETTINGS

ACTION_WIFI_SETTINGS

ACTION_APN_SETTINGS

ACTION_BLUETOOTH_SETTINGS

ACTION_DATE_SETTINGS

ACTION_LOCALE_SETTINGS

ACTION_INPUT_METHOD_SETTINGS

ACTION_DISPLAY_SETTINGS

ACTION_SECURITY_SETTINGS

ACTION_LOCATION_SOURCE_SETTINGS

ACTION_INTERNAL_STORAGE_SETTINGS

ACTION_MEMORY_CARD_SETTINGS


Data URI Scheme:空

MIME Type:空


示例:

public void openWifiSettings() {
    Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

短消息類別(Text Messaging)


創建短信/彩信 並攜帶附件(Compose an SMS/MMS message with attachment)


Action:

ACTION_SENDTO

ACTION_SEND

ACTION_SEND_MULTIPLE


Data URI Scheme:

sms:

smsto:

mms:

mmsto:

以上四種方式效果相同


MIME Type:

"text/plain"

"image/*"

"video/*"


Extras:

"subject",該鍵對應值是一個字符串,表示發送短信的標題(通常只適用於發短信)。

"sms_body",該鍵對應值是一個字符串,表示消息內容。

EXTRA_STREAM,該鍵對應的值是一個Uri地址,它指向了附加文件,若action為ACTION_SEND_MULTIPLE,則這個值應該是一個ArrayList對象。


示例:

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setType(HTTP.PLAIN_TEXT_TYPE);
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

若您通過intent打開的確實是一個發送短消息的應用(而不是Email或是社交類的應用),那麼可以按如下方式操作:

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  // This ensures only SMS apps respond
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

與之匹配的intent-filter配置如下:


    
        
        
        
        
    

網頁浏覽器類別(Web Browser)


加載網頁URL(Load a web URL)


Action:ACTION_VIEW

Data URI Scheme:

http:

https:

MIME Type:

"text/plain"

"text/html"

"application/xhtml+xml"

"application/vnd.wap.xhtml+xml"


示例:

public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

與之匹配的intent-filter:


    
        
        
        
        
        
        
    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved