android 利用隱式Intent打開圖片


實現功能

  點擊“查看圖片”時能夠跳出提示,選擇系統圖庫打開還是自己編寫的應用打開,並且對於下載好的圖片也有效。

  

1.我將 qiaoba.jpg 放在 res/drawable 目錄下,通過按鈕設置打開圖片,在按鈕的監聽設置如下:

 findViewById(R.id.btn_openImage).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //要是自定義應用打開圖片必須添加ACTION_VIEW的Intent
                Intent intent = new Intent(Intent.ACTION_VIEW);
                //進行圖片-->bitmap-->uri轉換
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.qiaoba);
                //系統提供了現成的API讓用戶可以將自己喜歡的圖片保存到系統相冊中.
                String uriString = MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,null,null);
                System.out.println(uriString);
                Uri uri = Uri.parse(uriString);
                //設置數據和類型可以用setData( )或setType( ) ,但是同時設置的話是不生效的,
                // 只能使用setDataAndType( ) ,image代表圖片,星號代表圖片中所有格式,
                // 可根據自己需要篩選,如只想打開jpg類型圖片可用“image/jpg”
                intent.setDataAndType(uri,"image/*");
                startActivity(intent);
            }
        });

2.之前發送了打開圖片的請求,接下來添加一個顯示圖片的java文件“ShowImageAty.java”,並添加一個對應的“aty_show_image.xml”文件

public class ShowImageAty extends AppCompatActivity {
    ImageView ivQiaoba;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.aty_show_image);
        ivQiaoba = (ImageView) findViewById(R.id.iv_qiaoba);
        Intent getImage = getIntent();
        //不為空判斷
        if (getImage != null) {
            //獲取intent傳遞過來的uri數據
            Uri data = getImage.getData();
            if (data != null) {
                ivQiaoba.setImageURI(data);
            }
        }


    }
}

3.在AndroidManifest.xml文件中設置intent-filter標簽以及注冊網絡以及文件讀寫權限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jikexueyuan.notepad.simplepicturebrowser">


    <!--訪問網絡權限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 讀寫SD卡權限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".ShowImageAty"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 這個屬性用於設定數據的MIME類型,如:image/jpeg或audio/mpeg4-generic。
               其子類型可用星號通配符(*)來代替,指示能夠跟任何子類型匹配。 -->
                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>

    </application>




</manifest>

 

 

另外提一點,如果再android6.0,targetSDKVersion 23 以上運行就要手動注冊讀寫權限了,如果測試版本在 23 以上,會報這樣的錯

java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2317, uid=10064 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

 

 

手動注冊讀寫權限見:http://blog.csdn.net/dzsw0117/article/details/51212612


免責聲明!

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



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