根據記憶中eoe的Intent相關視頻,模仿,寫一個打開圖片的Activity
1、在主Activity的button時間中,通過設置action、category、data打開一個圖片。這時代碼已經可以運行,將使用系統默認的工具打開圖片。
Intent intentImage = new Intent(Intent.ACTION_VIEW); intentImage.addCategory(Intent.CATEGORY_DEFAULT); File file = new File("/storage/emulated/legacy/Download/xhtml.jpg"); intentImage.setDataAndType(Uri.fromFile(file), "image/*"); startActivity(intentImage);
2、自己定義一個Activity,用來展示圖片。可以增加一個對應的layout文件,也可以不增加layout文件,直接使用ImageView來呈現圖片。需要在Manifest中增加對應的Activity標簽。這時再次點擊按鈕就會出現選擇應用程序。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageView = new ImageView(this); setContentView(imageView); Intent imageIntent = getIntent(); imageView.setImageURI(imageIntent.getData()); }
<activity android:name="ShowImageActivity"> <intent-filter > <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*" android:scheme="file"/> </intent-filter> </activity>
3、經過上面的處理,已經可以選擇自己的圖片瀏覽器了。但是在選擇使用自己的圖片瀏覽器打開圖片的時候,是一片空白,什么都沒有,而使用系統默認的工具,則可以正常打開圖片。打開LogCat發現以下警告信息“ java.io.FileNotFoundException: /storage/emulated/legacy/Download/xhtml.jpg: open failed: EACCES (Permission denied)”,網上搜索一下即可發現,是因為沒有訪問該目錄的權限,可以參考這個博客android 讀取sd卡中的圖片。在Manifest文件中增加權限,這次程序可以正常運行了。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
在寫這個程序的過程中,發現以下需要注意的地方:
- 在第1步的代碼中,雖然File中對應的目錄實際上指向/mnt/shell/emulated/0目錄下的內容,但是因為shell目錄的權限為drwx------,沒有權限訪問這個目錄,所以只能使用下面的目錄訪問對應的圖片
- 在第1步的代碼中,intentImage.setData(Uri.fromFile(file))這樣設置data時,不能打開圖片,報錯“android.content.ActivityNotFoundException: No Activity found to handle Intent ”,找不到Activity,通過報錯可以知道,不設置type的話,系統找不到與其匹配的activity。為了測試,可以在第2步的xml文件中對應的<data>標簽,不設置mimeType,只設置scheme。而第1步中的代碼也不設置類型,改成intentImage.setData(Uri.fromFile(file))。發現這時就不會報錯,會自動調用自己寫的這個圖片瀏覽器。
- intent.setComponent(),設置之后,將精准定位到具體的component。
- 在Manifest文件中,Activity、Service、Receiver可以通過設置intent-filter標簽,在其中加入action、category、data,以后系統通過隱式調用Activity、Service、Receiver時,就可以找到我們定義的Component
4、可以通過activity的setTheme(int)方法設置顯示樣式。例如,可以不顯示標題、以對話框的方式顯示窗口。
