1. 程式人生 > >android之Itent.ACTION_PICK Intent.ACTION_GET_CONTENT妙用

android之Itent.ACTION_PICK Intent.ACTION_GET_CONTENT妙用

你是不是很多時候,想從彈出的電話本姓名列表中中查詢到某個人,然後再獲取該人的詳細資訊呢?

你是不是想選擇從彈出的列表中選擇一張圖片,然後將其進行進一步的操作呢?

如果,你想,那你是不是很像知道,我們應該怎麼讓其彈出來一張選擇列表,又應該怎麼程式碼實現後邊的操作呢?

Itent.ACTION_PICK  Intent.ACTION_GET_CONTENT 兩者都可以完成類似的功能,讓我們一起來看下例子:

第一:Intent.ACTION_PICK

首先新增一個許可權:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
發起一個 Contact Picker
Intent intent = new Intent(Intent.ACTION_PICK, People.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);
重寫方法
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data)
  { 
      super.onActivityResult(reqCode, resultCode, data); 
        switch (reqCode) {
             case (PICK_CONTACT) :     
             if (resultCode == Activity.RESULT_OK) {       
             Uri contactData = data.getData();       
             Cursor c =  managedQuery(contactData, null, null, null, null);       
             if (c.moveToFirst()) {         
                String name = c.getString(c.getColumnIndexOrThrow(People.NAME));         
                // TODO Whatever you want to do with the selected contact name.       
                                 }     
                      }     
              
      break; 
               
         }
   }

例如
String[] columns = new String[] {People.NAME};
int[] names = new int[] {R.id.row_entry};
mAdapter = new SimpleCursorAdapter(this, R.layout.mycontacts, C, columns, names);
setListAdapter(mAdapter);
第二:Intent.ACTION_GET_CONTENT 我們可以發現,其實action_get_content是通過intent中設定的type屬性來判斷具體呼叫哪個程式的。
  1. Intent intent = new Intent(Intent.ACTION_GET_CONTENT);   
  2. intent.setType("audio/*");   
  3. startActivity(Intent.createChooser(intent, "Select music"));  

執行之 會彈出一個對話方塊 效果為:

 

其實 對於這段程式碼 大家應該都能猜出什麼意思  現自己模擬並理解之 [程式碼]

1. 定義TestActivity 用於根據傳入Uri  播放目標

    public class TestActivity extends Activity {   
           
        @Override  
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            setContentView(R.layout.main);   
            this.setTitle("TestActivity");   
               
            Intent i = this.getIntent();   
               
            Uri u = i.getData();   
               
            try {   
                playMusic(u);   
            } catch (IllegalArgumentException e) {   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            } catch (SecurityException e) {   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            } catch (IllegalStateException e) {   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            } catch (IOException e) {   
                // TODO Auto-generated catch block   
                e.printStackTrace();   
            }   
        }   
           
        public void playMusic(Uri uri) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{   
            MediaPlayer mp = new MediaPlayer();   
            mp.setDataSource(this, uri);   
            mp.prepare();   
            mp.start();   
        }   
    }  

2. 在AndroidManifest 註冊TestActivity

    <activity android:name=".TestActivity"  
                      android:label="TestActivity">   
                <intent-filter>   
                    <action android:name="android.intent.action.GET_CONTENT" />   
                     <category android:name="android.intent.category.DEFAULT" />   
                     <category android:name="android.intent.category.OPENABLE" />   
                     <data android:mimeType="audio/music1" />   
                </intent-filter>   
            </activity>  

3. 使用TestActivity
    public void sendChooser(){   
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);   
               
            intent.setDataAndType(Uri.parse("file:///sdcard/DCIM/cc.mp3"), "audio/music1");   
      
            startActivity(Intent.createChooser(intent, "Select music1 app"));   
        }  

4. emulator 執行截圖:

 

此外:

   //選擇圖片 requestCode 返回的標識

  Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"

  innerIntent.setType(contentType); //檢視型別 String IMAGE_UNSPECIFIED = "image/*";

  Intent wrapperIntent = Intent.createChooser(innerIntent, null);

  ((Activity) context).startActivityForResult(wrapperIntent, requestCode);

  //視訊

  Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);

  innerIntent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";

  Intent wrapperIntent = Intent.createChooser(innerIntent, null);

  ((Activity) context).startActivityForResult(wrapperIntent, requestCode);

  //新增音訊

  Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);

  innerIntent.setType(contentType); //String VIDEO_UNSPECIFIED = "video/*";

  Intent wrapperIntent = Intent.createChooser(innerIntent, null);

  ((Activity) context).startActivityForResult(wrapperIntent, requestCode);

  //錄音

  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

  intent.setType(ContentType.AUDIO_AMR); //String AUDIO_AMR = "audio/amr";

  intent.setClassName("com.android.soundrecorder",

  "com.android.soundrecorder.SoundRecorder");

  ((Activity) context).startActivityForResult(intent, requestCode);

  //拍攝視訊

  int durationLimit = getVideoCaptureDurationLimit(); //SystemProperties.getInt("ro.media.enc.lprof.duration", 60);

  Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

  intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);

  intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, sizeLimit);

  intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, durationLimit);

  startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);

  //拍照 REQUEST_CODE_TAKE_PICTURE 為返回的標識

  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //"android.media.action.IMAGE_CAPTURE";

  intent.putExtra(MediaStore.EXTRA_OUTPUT, Mms.ScrapSpace.CONTENT_URI); // output,Uri.parse("content://mms/scrapSpace");

  startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);