Android 自己寫一個打開圖片的Activity


 

根據記憶中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)方法設置顯示樣式。例如,可以不顯示標題、以對話框的方式顯示窗口。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM