在 Android 開發中,常見的需求是從通知欄或其他應用啟動自家 Activity 並獲取資源(如圖片)的 URI。這通常涉及隱式 Intent機制。本文將詳細說明如何正確接收並解析傳遞過來的 URI。
當用戶在通知欄點擊一張圖片時,系統會發送一個隱式 Intent(通常為 ACTION_VIEW),並將圖片的 URI 封裝在 Intent 的 data 欄位中。接收端 Activity 需在 AndroidManifest.xml 中聲明相應的 <intent-filter> 以響應該動作。
<activity android:name=".YourActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="content" />
<data android:scheme="file" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
if (intent != null && intent.getData() != null) {
Uri imageUri = intent.getData();
// 這裡拿到的 imageUri 即為圖片的真實路徑
// 後續可用 ContentResolver.openInputStream(imageUri) 讀取圖片
Log.d("URI_DEMO", "收到圖片 URI: " + imageUri.toString());
}
}
FileProvider 共享 file:// URI,否則會拋出 FileUriExposedException。singleTop,需覆寫 onNewIntent() 以獲取最新 Intent。intent.getData() != null,避免空指針異常。若發送方將數據放在 Extra 中(如示例代碼所示),接收端可用 getStringExtra()、getIntExtra() 等方法提取,注意 Key 名稱必須雙方一致。
// 發送端
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("image_name", "photo.jpg");
startActivity(intent);
// 接收端
String name = getIntent().getStringExtra("image_name");
掌握隱式 Intent 的 URI 獲取流程,關鍵在於:正確配置 Intent Filter、在 onCreate/onNewIntent 中調用 getIntent().getData()、妥善處理權限與生命週期。遵循上述步驟,即可無縫實現從通知欄或其他應用接收圖片資源的功能。