通用Intent

(1)鬧鐘

  • 創(chuàng)建鬧鐘(ACTION_SET_ALARM)
    示例Intent:
public void createAlarm(String message, int hour, int minutes) 
{ 
       Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) 
                      .putExtra(AlarmClock.EXTRA_MESSAGE, message) //用于標(biāo)識(shí)鬧鐘的自定義消息
                      .putExtra(AlarmClock.EXTRA_HOUR, hour)  //鬧鐘的小時(shí)
                      .putExtra(AlarmClock.EXTRA_MINUTES, minutes);   //鬧鐘的分鐘
       if (intent.resolveActivity(getPackageManager()) != null)
         {  
                    startActivity(intent);    //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
         }
}

注:為了調(diào)用ACTION_SET_ALARM,應(yīng)用必須在清單文件中注冊(cè)SET_ALARM權(quán)限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_ALARM" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 創(chuàng)建定時(shí)器(ACTION_SET_TIMER)
    示例Intent:
public void startTimer(String message, int seconds)
 {
    Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)  //用于標(biāo)識(shí)定時(shí)器的自定義消息
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)  //以秒為單位的定時(shí)器定時(shí)長(zhǎng)度
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);  //一個(gè)布爾型值,用于指定響應(yīng)定時(shí)器的應(yīng)用在設(shè)置定時(shí)器時(shí)是否應(yīng)跳過(guò)其 UI。 
                  //若為 true,則應(yīng)用應(yīng)跳過(guò)任何確認(rèn) UI,直接啟動(dòng)指定的定時(shí)器。
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);  //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

注:為了調(diào)用ACTION_SET_TIMER,應(yīng)用必須在清單文件中注冊(cè)SET_ALARM權(quán)限:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SET_TIMER" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 顯示所有鬧鈴(ACTION_SHOW_ALARMS)
      盡管調(diào)用此 Intent 的應(yīng)用并不多(使用它的主要是系統(tǒng)應(yīng)用),但任何充當(dāng)鬧鐘的應(yīng)用都應(yīng)實(shí)現(xiàn)此 Intent 過(guò)濾器,并通過(guò)顯示現(xiàn)有鬧鈴列表作出響應(yīng)。
    :此 Intent 是在 Android 4.4(API 級(jí)別 19)中添加的。
    示例 Intent 過(guò)濾器:
<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SHOW_ALARMS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

(2)日歷

  • 添加日歷事件
    (使用 ACTION_INSERT操作,并指定具有 Events.CONTENT_URI的數(shù)據(jù) URI)

    示例 Intent:
public void addEvent(String title, String location, Calendar begin, Calendar end)
 {
    Intent intent = new Intent(Intent.ACTION_INSERT)
            .setData(Events.CONTENT_URI)  //指定內(nèi)容URI
            .putExtra(Events.TITLE, title)  //事件標(biāo)題
            .putExtra(Events.EVENT_LOCATION, location)  //事件地點(diǎn)
            .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin)  //事件的開(kāi)始時(shí)間(從新紀(jì)年開(kāi)始計(jì)算的毫秒數(shù))
            .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end);  //事件的結(jié)束時(shí)間(從新紀(jì)年開(kāi)始計(jì)算的毫秒數(shù))
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);  //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.INSERT" />
        <data android:mimeType="vnd.android.cursor.dir/event" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

(3)相機(jī)

  • 拍攝照片或視頻并將其返回
    ( ACTION_IMAGE_CAPTURE 或 ACTION_VIDEO_CAPTURE)

      如需打開(kāi)相機(jī)應(yīng)用并接收拍攝的照片或視頻,可使用 ACTION_IMAGE_CAPTURE或 ACTION_VIDEO_CAPTURE操作。此外,還可在 EXTRA_OUTPUT extra 中指定希望相機(jī)將照片或視頻保存到的 URI 位置。
    示例 Intent:
static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri mLocationForPhotos;
public void capturePhoto(String targetFilename)
 {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //使用相機(jī)拍照
    intent.putExtra(MediaStore.EXTRA_OUTPUT,  //設(shè)置相機(jī)應(yīng)用應(yīng)將照片或視頻文件保存到的 URI 位置
                    Uri.withAppendedPath(mLocationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
            {
                  //通過(guò)startActivityForResult獲得Intent中返回縮小尺寸的照片副本(縮略圖)
                  startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
             }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
 {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK)
             {
                    //拍照獲得的副本(縮略圖)以Bitmap形式保存在名為 "data"的 extra 字段中
                    Bitmap thumbnail = data.getParcelable("data");//獲得副本Bitmap
                    //此外,還可以通過(guò)URI訪問(wèn)原始尺寸的照片或視頻,該URI為上面通過(guò)EXTRA_OUTPUT設(shè)置的URI
                    // Do other work with full size photo saved in mLocationForPhotos
                    ...
              }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

處理此 Intent 的Activity 應(yīng)檢查傳入Intent中有無(wú)EXTRA_OUTPUT extra,然后將拍攝的圖像或視頻保存在該 extra 指定的位置,并調(diào)用帶Intent的setResult(),該 Intent 將經(jīng)過(guò)壓縮的縮略圖包括在名為 "data"的 extra中,注意相關(guān)權(quán)限的注冊(cè)。

  • 以靜態(tài)圖像或視頻模式啟動(dòng)相機(jī)應(yīng)用(INTENT_ACTION_STILL_IMAGE_CAMERA或INTENT_ACTION_VIDEO_CAMERA)
      假如僅僅是調(diào)用系統(tǒng)照相機(jī)拍照,不關(guān)心拍照結(jié)果,則可用靜態(tài)圖像模式下啟動(dòng)相機(jī),該action所啟動(dòng)的Intent只是打開(kāi)相機(jī),不做任何處理,且將停留在相機(jī)應(yīng)用里,拍完一張照片后不返回原來(lái)的應(yīng)用,并將照片保存到系統(tǒng)的默認(rèn)照片保存路徑。
    示例 Intent:
public void capturePhoto()
 {
    Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
    //Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivityForResult(intent);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
          <!--若為視頻模式此處應(yīng)為"android.media.action.VIDEO_CAMERA"-->
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

(4)聯(lián)系人

  • 選擇聯(lián)系人
    (使用ACTION_PICK操作,并將 MIME 類型指定為Contacts.CONTENT_TYPE)

    示例 Intent:
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)
    {
         //回調(diào)的結(jié)果Intent包含指向所選聯(lián)系人的 content:URI,
        //響應(yīng)會(huì)利用Contacts Provide API 為我們的應(yīng)用授予該聯(lián)系人的臨時(shí)讀取權(quán)限,
        //即使我們的應(yīng)用不具READ_CONTACTS權(quán)限也沒(méi)有關(guān)系。
        startActivityForResult(intent, REQUEST_SELECT_CONTACT);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
 
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
 {
    if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK)
 {
        Uri contactUri = data.getData(); //取出包含指向所選聯(lián)系人的 content:URI,讀取該聯(lián)系人的詳情并不需要READ_CONTACTS權(quán)限
        // Do something with the selected contact at contactUri
        ...
    }
}
  • 選擇特定聯(lián)系人數(shù)據(jù)(使用ACTION_PICK操作,并指定特定 MIME 類型)
      如需讓用戶選擇某一條聯(lián)系人信息,如電話號(hào)碼、電子郵件地址或其他數(shù)據(jù)類型,需使用ACTION_PICK操作,并指定MIME 類型為下列其中一個(gè)內(nèi)容類型:
  1. CommonDataKinds.Phone.CONTENT_TYPE——從有電話號(hào)碼的聯(lián)系人中選取
  2. CommonDataKinds.Email.CONTENT_TYPE——從有電子郵件地址的聯(lián)系人中選取
  3. CommonDataKinds.StructuredPostal.CONTENT_TYPE——從有郵政地址的聯(lián)系人中選取
  4. ContactsContract下眾多其他 CONTENT_TYPE值中的一個(gè)
      如果只需要檢索一種類型的聯(lián)系人數(shù)據(jù),則此方法要比上一部分中使用的MIME 類型Contacts.CONTENT_TYPE更高效,因?yàn)榻Y(jié)果可讓我們直接訪問(wèn)所需數(shù)據(jù),無(wú)需對(duì)聯(lián)系人提供程序執(zhí)行更復(fù)雜的查詢。
    示例 Intent:
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);//從有電話號(hào)碼的聯(lián)系人中選取
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
 { 
   if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) 
{
        Uri contactUri = data.getData(); //得到指向所選聯(lián)系人數(shù)據(jù)的 content:URI
        String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
        Cursor cursor = getContentResolver().query(contactUri, projection,
                null, null, null);  //從聯(lián)系人提供程序中查詢電話號(hào)碼
        if (cursor != null && cursor.moveToFirst()) {  //若cursor的返回值有效,取出查詢到的電話號(hào)碼
            int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(numberIndex);
            //對(duì)取出的電話號(hào)碼進(jìn)行一些操作
            ... 
       } 
   }
}

由于查詢出來(lái)的cursor的初始位置是指向第一條記錄的前一個(gè)位置的,故使用cursor.moveToFirst()函數(shù)來(lái)指向查詢結(jié)果的第一個(gè)位置。一般通過(guò)判斷cursor.moveToFirst()的值為true或false來(lái)確定查詢結(jié)果是否為空。

  • 查看聯(lián)系人(使用ACTION_VIEW操作,并使用 content:URI 作為 Intent 數(shù)據(jù)指定聯(lián)系人)
    初次檢索聯(lián)系人URI 的方法主要有兩種:
  1. 使用ACTION_PICK返回的聯(lián)系人 URI,如上述所示(此方法不需要任何應(yīng)用權(quán)限)
  2. 直接訪問(wèn)所有聯(lián)系人的列表(此方法需要 READ_CONTACTS權(quán)限)
    示例 Intent:
public void viewContact(Uri contactUri)
 {
    Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);//無(wú)需指定MIME類型,該類型可以從聯(lián)系人URI中推斷得出
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);
    }
}
  • 編輯現(xiàn)有聯(lián)系人(ACTION_EDIT操作+data+extra)
    如需編輯已知聯(lián)系人,需使用ACTION_EDIT操作,使用 content:URI 作為 Intent 數(shù)據(jù)指定聯(lián)系人,并將 extra 中由常量指定的任何已知聯(lián)系人信息包括在ContactsContract.Intents.Insert中
    示例 Intent:
public void editContact(Uri contactUri, String email)
 {
    Intent intent = new Intent(Intent.ACTION_EDIT);
    intent.setData(contactUri);
    //可使用ContactsContract.Intents.Insert中定義的一個(gè)或多個(gè)extra,來(lái)填充聯(lián)系人詳情字段
    intent.putExtra(Intents.Insert.EMAIL, email); 
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}
  • 插入聯(lián)系人(ACTION_INSERT操作+type+extra)
    如需插入新聯(lián)系人,需使用ACTION_INSERT操作,將Contacts.CONTENT_TYPE指定為 MIME 類型,并將 extra 中由常量指定的任何已知聯(lián)系人信息包括在ContactsContract.Intents.Insert中。
    示例 Intent:
public void insertContact(String name, String email)
 {
    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setType(Contacts.CONTENT_TYPE);
    //可使用ContactsContract.Intents.Insert中定義的一個(gè)或多個(gè)extra
    intent.putExtra(Intents.Insert.NAME, name);
    intent.putExtra(Intents.Insert.EMAIL, email); 
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

(5)電子郵件

  • 撰寫(xiě)帶有可選附件的電子郵件
    如需撰寫(xiě)電子郵件,可根據(jù)其是否包括附件使用以下其中一項(xiàng)操作(action):
  1. ACTION_SENDTO(適用于不帶附件)
  2. ACTION_SEND(適用于帶一個(gè)附件)
  3. ACTION_SEND_MULTIPLE(適用于帶多個(gè)附件)
    并使用下列 extra 鍵加入收件人和主題等電子郵件詳情:
  4. Intent.EXTRA_EMAIL
    包含所有“主送”收件人電子郵件地址的字符串?dāng)?shù)組。
  5. Intent.EXTRA_CC
    包含所有“抄送”收件人電子郵件地址的字符串?dāng)?shù)組。
  6. Intent.EXTRA_BCC
    包含所有“密件抄送”收件人電子郵件地址的字符串?dāng)?shù)組。
  7. Intent.EXTRA_SUBJECT
    包含電子郵件主題的字符串。
  8. Intent.EXTRA_TEXT
    包含電子郵件正文的字符串。
  9. Intent.EXTRA_STREAM
    指向附件的 Uri。如果使用的是 ACTION_SEND_MULTIPLE 操作,應(yīng)將其改為包含多個(gè) Uri對(duì)象的 ArrayList。
    示例 Intent:
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);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

如果您想確保 Intent 只由電子郵件應(yīng)用(而非其他短信或社交應(yīng)用)進(jìn)行處理,則需使用 ACTION_SENDTO操作并加入 "mailto:"數(shù)據(jù)架構(gòu)。例如:

public void composeEmail(String[] addresses, String subject)
 {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // 只有電子郵件應(yīng)用才能處理
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null)
    { 
       startActivity(intent);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="*/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

(6)文件存儲(chǔ)

  • 檢索特定類型的文件(ACTION_GET_CONTENT操作+type)
      如需請(qǐng)求用戶選擇文檔或照片等文件并向我們的應(yīng)用返回文件引用,需使用ACTION_GET_CONTENT操作并指定所需 MIME 類型。 返回的文件引用對(duì) Activity 的當(dāng)前生命周期而言是瞬態(tài)引用,因此如果想稍后進(jìn)行訪問(wèn),就必須導(dǎo)入可在稍后讀取的副本。用戶還可利用此 Intent 在進(jìn)程中創(chuàng)建新文件(例如,用戶可以不選擇現(xiàn)有照片,而是用相機(jī)拍攝新照片)。
      傳送至onActivityResult()方法的結(jié)果 Intent 包括的數(shù)據(jù)具有指向該文件的 URI。該 URI 可以是任何類型,如 http:URI、file:URI 或 content:URI。 不過(guò),如果想將可選擇的文件限定為可從內(nèi)容提供程序 (content:URI) 訪問(wèn)的文件,以及通過(guò)openFileDescriptor()以文件流形式提供的文件,則應(yīng)該為 Intent 添加CATEGORY_OPENABLE類別。
      在 Android 4.3(API 級(jí)別 18)及更高版本上,我們還可以通過(guò)為 Intent 添加EXTRA_ALLOW_MULTIPLE并將其設(shè)置為 true,允許用戶選擇多個(gè)文件。然后我們就可以在getClipData()返回的ClipData對(duì)象中訪問(wèn)每一個(gè)選定的文件。
    用于獲取照片的示例 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);   //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}
@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 過(guò)濾器

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.OPENABLE" />
    </intent-filter>
</activity>
  • 打開(kāi)特定類型的文件
    (ACTION_OPEN_DOCUMENT或ACTION_CREATE_DOCUMENT,并指定 MIME 類型)

      如果只想讀取現(xiàn)有文件而不將其副本導(dǎo)入我們的應(yīng)用,或者想就地打開(kāi)和編輯文件,特別適合使用ACTION_OPEN_DOCUMENT操作(而不是使用ACTION_GET_CONTENT來(lái)導(dǎo)入應(yīng)用的文件副本)。如果還需要允許用戶創(chuàng)建應(yīng)用可寫(xiě)入的新文檔,可改用 ACTION_CREATE_DOCUMENT操作
    注意: Intent 必須指定 MIME 類型,并且必須聲明CATEGORY_OPENABLE類別。必要時(shí),還可以使用EXTRA_MIME_TYPES extra 添加一個(gè) MIME 類型數(shù)組來(lái)指定多個(gè) MIME 類型——但這種情況下必須將setType()中的主 MIME 類型設(shè)置為 "*/*"
  • 用于獲取照片的示例 Intent
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);
    //只有系統(tǒng)能接收到ACTION_OPEN_DOCUMENT, 所以此處不需要判斷Activity是否存在
    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
        ...
    }
}

第三方應(yīng)用實(shí)際上無(wú)法通過(guò)ACTION_OPEN_DOCUMENT操作響應(yīng) Intent,而是由系統(tǒng)接收此 Intent,然后在統(tǒng)一用戶界面中顯示各類應(yīng)用提供的所有文件。
  如需在該用戶界面中提供我們的應(yīng)用的文件,并允許其他應(yīng)用打開(kāi)它們,則必須實(shí)現(xiàn)一個(gè)DocumentsProvider,并加入一個(gè)PROVIDER_INTERFACE Intent 過(guò)濾器("android.content.action.DOCUMENTS_PROVIDER")。例如:

<provider ...
    android:grantUriPermissions="true"
    android:exported="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">
    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>
</provider>

(7)本地操作

  • 叫車(chē)( ACTION_RESERVE_TAXI_RESERVATION操作)
    示例 Intent:
public void callCar()
 {
    Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION);
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);  //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 地圖(使用ACTION_VIEW操作,并在Intent 數(shù)據(jù)中指定位置信息)
    指定位置信息表示方式有多種,這里舉一個(gè)最簡(jiǎn)單的示例:"geo:47.6,-122.3",表示顯示給定經(jīng)度和緯度處的地圖
    示例 Intent:
public void showMap(Uri geoLocation)
 {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(geoLocation);
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent); //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="geo" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 播放媒體文件(使用ACTION_VIEW操作,并在Intent 數(shù)據(jù)中指定位置信息)
    示例 Intent:
public void playMedia(Uri file)
 {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(file);
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent); //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:type="audio/*" />
        <data android:type="application/ogg" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 撥打電話
    (使用ACTION_DIAL或ACTION_CALL操作,并使用數(shù)據(jù)URI指定電話號(hào)碼)

      使用ACTION_DIAL操作撥打電話,會(huì)打開(kāi)電話應(yīng)用并顯示電話號(hào)碼,但用戶必需按撥打電話按鈕才能開(kāi)始通話。
      如需直接撥打電話,需使用ACTION_CALL操作,并使用數(shù)據(jù)URI指定電話號(hào)碼。電話應(yīng)用打開(kāi)時(shí)便會(huì)撥打電話,用戶無(wú)需按撥打電話按鈕。ACTION_CALL操作需要在清單文件中添加 CALL_PHONE權(quán)限:<uses-permission android:name="android.permission.CALL_PHONE" />
    示例 Intent:
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); //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}
  • 發(fā)送短信
    (ACTION_SENDTO、ACTION_SEND或ACTION_SEND_MULTIPLE操作+extra)

      如需發(fā)起短信或彩信,需使用ACTION_SENDTO(無(wú)附件發(fā)送)、ACTION_SEND(帶附件的發(fā)送)或ACTION_SEND_MULTIPLE(帶多個(gè)附件的發(fā)送)其中一個(gè) Intent 操作,并使用下列 extra 鍵指定電話號(hào)碼、主題和消息正文等消息詳情。
    示例 Intent:
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); //指向附件的圖像或視頻的Uri
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent); //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

如果想確保 Intent 只由短信應(yīng)用(而非其他電子郵件或社交應(yīng)用)進(jìn)行處理,則需使用ACTION_SENDTO操作并設(shè)置data "smsto:"。例如:

public void composeMmsMessage(String message, Uri attachment)
 {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  //確保只有短信應(yīng)用進(jìn)行處理
    intent.putExtra("sms_body", message); //表示消息正文的字符串
    intent.putExtra(Intent.EXTRA_STREAM, attachment); //指向附件的圖像或視頻的Uri
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent); //確認(rèn)存在對(duì)應(yīng)Activity組件再開(kāi)啟
    }
}

示例 Intent 過(guò)濾器:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="text/plain" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  • 設(shè)置
    如需在應(yīng)用要求用戶更改內(nèi)容時(shí)打開(kāi)某個(gè)系統(tǒng)設(shè)置屏幕,可使用下列其中一個(gè) Intent 操作打開(kāi)與操作名稱對(duì)應(yīng)的設(shè)置屏幕:
  1. ACTION_SETTINGS
  2. ACTION_WIRELESS_SETTINGS
  3. ACTION_AIRPLANE_MODE_SETTINGS
  4. ACTION_WIFI_SETTINGS
  5. ACTION_APN_SETTINGS
  6. ACTION_BLUETOOTH_SETTINGS
  7. ACTION_DATE_SETTINGS
  8. ACTION_LOCALE_SETTINGS
  9. ACTION_INPUT_METHOD_SETTINGS
  10. ACTION_DISPLAY_SETTINGS
  11. ACTION_SECURITY_SETTINGS
  12. ACTION_LOCATION_SOURCE_SETTINGS
  13. ACTION_INTERNAL_STORAGE_SETTINGS
  14. ACTION_MEMORY_CARD_SETTINGS
    示例 Intent:
public void openWifiSettings()
 {
    Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS); //打開(kāi)Wifi設(shè)置界面
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);
    }
}
  • 執(zhí)行網(wǎng)頁(yè)搜索(使用ACTION_WEB_SEARCH操作,并在extra中指定搜索字符串)
    示例 Intent:
public void searchWeb(String query)
 {
    Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
    intent.putExtra(SearchManager.QUERY, query);//在SearchManager.QUERY extra 中指定搜索字符串
    if (intent.resolveActivity(getPackageManager()) != null)
    {
        startActivity(intent);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 6,511評(píng)論 0 17
  • 注:本文完全拷貝自https://developer.android.com/guide/components/i...
    RxCode閱讀 1,800評(píng)論 1 13
  • 一直孜孜不倦想給自己取個(gè)好名字。小學(xué)的時(shí)候,課本里有一首歌叫刨洋芋,和我的名字諧音,男同學(xué)們就跑來(lái)笑話我。我覺(jué)得特...
    芋頭姐閱讀 429評(píng)論 0 2
  • 這世上有一種東西是百害而無(wú)一利的——那就是發(fā)脾氣。教育孩子也是如此。發(fā)脾氣是教育的最大死敵,脾氣越大,教育效果越差...
    朵朵頤閱讀 214評(píng)論 1 4
  • 作業(yè)1:記錄一段真實(shí)生活中的人物的語(yǔ)言,或者是兩三個(gè)人物的對(duì)話。(可以先錄音下來(lái)然后逐字打出來(lái)) 作業(yè)2:學(xué)習(xí)張愛(ài)...
    余小頭閱讀 317評(píng)論 2 0