当前位置: 移动技术网 > IT编程>移动开发>Android > Android实现选择相册图片并显示功能

Android实现选择相册图片并显示功能

2019年07月23日  | 移动技术网IT编程  | 我要评论

认识大自然手抄报,吴仁慧,李继耐蔑视践踏军法

本文实例为大家分享了android实现选择相册图片并显示的具体代码,供大家参考,具体内容如下

需求描述: 选择手机相册中的一张图片,并通过imageview展示出来
参考博文:

效果展示:

示例代码:

mainactivity

package com.example.www.mutilmedia;

import android.manifest;
import android.app.activity;
import android.content.intent;
import android.content.pm.packagemanager;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.os.build;
import android.os.bundle;
import android.support.annotation.nonnull;
import android.support.v4.app.activitycompat;
import android.support.v7.app.appcompatactivity;
import android.util.log;
import android.view.view;
import android.widget.imageview;
import android.widget.toast;

import java.util.arrays;

public class mainactivity extends appcompatactivity {

  string[] mpermissionlist = new string[]{
      manifest.permission.write_external_storage,
      manifest.permission.read_external_storage};
  public static final int request_pick_image = 11101;
  private imageview mshowimg;

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);

    mshowimg = (imageview) findviewbyid(r.id.imageview);

  }

  @override
  public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) {
    super.onrequestpermissionsresult(requestcode, permissions, grantresults);
    switch (requestcode) {
      case 100:
        boolean writeexternalstorage = grantresults[0] == packagemanager.permission_granted;
        boolean readexternalstorage = grantresults[1] == packagemanager.permission_granted;
        log.e("mainactivity", arrays.tostring(grantresults));
        if (grantresults.length > 0 && writeexternalstorage && readexternalstorage) {
          getimage();
        } else {
          toast.maketext(this, "请设置必要权限", toast.length_short).show();
        }

        break;
    }
  }

  private void getimage() {
    if (build.version.sdk_int < build.version_codes.kitkat) {
      startactivityforresult(new intent(intent.action_get_content).settype("image/*"),
          request_pick_image);
    } else {
      intent intent = new intent(intent.action_open_document);
      intent.addcategory(intent.category_openable);
      intent.settype("image/*");
      startactivityforresult(intent, request_pick_image);
    }
  }

  @override
  protected void onactivityresult(int requestcode, int resultcode, intent data) {
    super.onactivityresult(requestcode, resultcode, data);
    if (resultcode == activity.result_ok) {
      switch (requestcode) {
        case request_pick_image:
          if (data != null) {
            string realpathfromuri = realpathfromuriutils.getrealpathfromuri(this, data.getdata());
            log.e("mainactivity", realpathfromuri);
            showimg(realpathfromuri);
          } else {
            toast.maketext(this, "图片损坏,请重新选择", toast.length_short).show();
          }

          break;
      }
    }
  }


  public void opencamera(view view) {
    activitycompat.requestpermissions(mainactivity.this, mpermissionlist, 100);
  }


  public void showimg(string path){
    bitmap bitmap = bitmapfactory.decodefile(path);
    mshowimg.setimagebitmap(bitmap);
  }

}

realpathfromuriutils

package com.example.www.mutilmedia;

import android.annotation.suppresslint;
import android.content.contenturis;
import android.content.context;
import android.database.cursor;
import android.net.uri;
import android.os.build;
import android.provider.documentscontract;
import android.provider.mediastore;

public class realpathfromuriutils {
  /**
   * 根据uri获取图片的绝对路径
   *
   * @param context 上下文对象
   * @param uri   图片的uri
   * @return 如果uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
   */
  public static string getrealpathfromuri(context context, uri uri) {
    int sdkversion = build.version.sdk_int;
    if (sdkversion >= 19) { // api >= 19
      return getrealpathfromuriaboveapi19(context, uri);
    } else { // api < 19
      return getrealpathfromuribelowapi19(context, uri);
    }
  }

  /**
   * 适配api19以下(不包括api19),根据uri获取图片的绝对路径
   *
   * @param context 上下文对象
   * @param uri   图片的uri
   * @return 如果uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
   */
  private static string getrealpathfromuribelowapi19(context context, uri uri) {
    return getdatacolumn(context, uri, null, null);
  }

  /**
   * 适配api19及以上,根据uri获取图片的绝对路径
   *
   * @param context 上下文对象
   * @param uri   图片的uri
   * @return 如果uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
   */
  @suppresslint("newapi")
  private static string getrealpathfromuriaboveapi19(context context, uri uri) {
    string filepath = null;
    if (documentscontract.isdocumenturi(context, uri)) {
      // 如果是document类型的 uri, 则通过document id来进行处理
      string documentid = documentscontract.getdocumentid(uri);
      if (ismediadocument(uri)) { // mediaprovider
        // 使用':'分割
        string id = documentid.split(":")[1];

        string selection = mediastore.images.media._id + "=?";
        string[] selectionargs = {id};
        filepath = getdatacolumn(context, mediastore.images.media.external_content_uri, selection, selectionargs);
      } else if (isdownloadsdocument(uri)) { // downloadsprovider
        uri contenturi = contenturis.withappendedid(uri.parse("content://downloads/public_downloads"), long.valueof(documentid));
        filepath = getdatacolumn(context, contenturi, null, null);
      }
    } else if ("content".equalsignorecase(uri.getscheme())) {
      // 如果是 content 类型的 uri
      filepath = getdatacolumn(context, uri, null, null);
    } else if ("file".equals(uri.getscheme())) {
      // 如果是 file 类型的 uri,直接获取图片对应的路径
      filepath = uri.getpath();
    }
    return filepath;
  }

  /**
   * 获取数据库表中的 _data 列,即返回uri对应的文件路径
   *
   * @return
   */
  private static string getdatacolumn(context context, uri uri, string selection, string[] selectionargs) {
    string path = null;

    string[] projection = new string[]{mediastore.images.media.data};
    cursor cursor = null;
    try {
      cursor = context.getcontentresolver().query(uri, projection, selection, selectionargs, null);
      if (cursor != null && cursor.movetofirst()) {
        int columnindex = cursor.getcolumnindexorthrow(projection[0]);
        path = cursor.getstring(columnindex);
      }
    } catch (exception e) {
      if (cursor != null) {
        cursor.close();
      }
    }
    return path;
  }

  /**
   * @param uri the uri to check
   * @return whether the uri authority is mediaprovider
   */
  private static boolean ismediadocument(uri uri) {
    return "com.android.providers.media.documents".equals(uri.getauthority());
  }

  /**
   * @param uri the uri to check
   * @return whether the uri authority is downloadsprovider
   */
  private static boolean isdownloadsdocument(uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getauthority());
  }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".mainactivity">

  <imageview
    android:id="@+id/imageview"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginstart="8dp"
    android:layout_margintop="8dp"
    android:layout_marginend="8dp"
    android:layout_marginbottom="8dp"
    app:layout_constraintbottom_tobottomof="parent"
    app:layout_constraintend_toendof="parent"
    app:layout_constraintstart_tostartof="parent"
    app:layout_constrainttop_tobottomof="@+id/button3"
    app:srccompat="@android:color/white" />

  <button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginstart="8dp"
    android:layout_margintop="16dp"
    android:layout_marginend="8dp"
    android:onclick="opencamera"
    android:text="camera"
    app:layout_constraintend_toendof="parent"
    app:layout_constrainthorizontal_bias="0.048"
    app:layout_constraintstart_tostartof="parent"
    app:layout_constrainttop_totopof="parent" />

</android.support.constraint.constraintlayout>

androidmanifest.xml

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

  <uses-permission android:name="android.permission.read_external_storage" />
  <uses-permission android:name="android.permission.write_external_storage" />

  <application
    android:allowbackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundicon="@mipmap/ic_launcher_round"
    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>
  </application>

</manifest>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网