qq_38766420 2017-05-12 14:42 采纳率: 0%
浏览 3003

Android通过调用相机可以显示图片,但从相册选择图片时无法显示

android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
    android:id="@+id/take_photo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Take Photo"
    android:textAllCaps="false"/>

<Button
    android:id="@+id/choose_from_album"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Choose From Album"
    android:textAllCaps="false" />

<ImageView
    android:id="@+id/picture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"/>

package com.example.administrator.cameraalbumtest;

import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.*;
import android.net.*;
import android.view.*;
import java.io.*;
import android.os.*;
import android.support.v4.content.*;
import android.content.*;
import android.provider.*;
import android.graphics.*;
import android.Manifest;
import android.support.v4.app.*;
import android.annotation.*;
import android.database.*;

public class MainActivity extends AppCompatActivity {

public static final int TAKE_PHOTO = 1;

private ImageView picture;

private Uri imageUri;

public static final int CHOOSE_PHOTO=2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button takePhoto = (Button)findViewById(R.id.take_photo);
    Button chooseFromAlbum = (Button)findViewById(R.id.choose_from_album);
    picture = (ImageView)findViewById(R.id.picture);
    takePhoto.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            File outputImage = new File(getExternalCacheDir(),
                    "output_image.jpg");
            try{
                if(outputImage.exists()){
                    outputImage.delete();
                }
                outputImage.createNewFile();
            }catch(IOException e){
                e.printStackTrace();
            }
            if(Build.VERSION.SDK_INT >= 24){
                imageUri = FileProvider.getUriForFile(MainActivity.this,
                        "com.example.administrator.cameraalbumtest.fileprovider",
                        outputImage);
            }else{
                imageUri = Uri.fromFile(outputImage);
            }
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
            startActivityForResult(intent,TAKE_PHOTO);
        }
    });
    chooseFromAlbum.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            if(ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.
                    PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(MainActivity.this,new
                String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE },1);
            }else{
                openAlbum();
            }
        }
    });
}

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
        case TAKE_PHOTO:
            if(resultCode == RESULT_OK){
                try{
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                    picture.setImageBitmap(bitmap);
                }catch(FileNotFoundException e){
                    e.printStackTrace();
                }
            }
            break;
        case CHOOSE_PHOTO:
            if(requestCode == RESULT_OK){
                if(Build.VERSION.SDK_INT >= 19){
                    handleImageOnKitKat(data);
                }else{
                    handleImageBeforeKitKat(data);
                }
            }
            break;
        default:
            break;
    }
}

private void openAlbum(){
    Intent intent = new Intent("android.intent.action.GET_CONTENT");
    intent.setType("image/*");
    startActivityForResult(intent,CHOOSE_PHOTO);
}

@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,
                                       int[] grantResults){
    switch(requestCode){
        case 1:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                openAlbum();
            }else{
                Toast.makeText(this,"You denied the permission",
                        Toast.LENGTH_SHORT).show();
            }
            break;
        default:
    }
}

@TargetApi(19)
private void handleImageOnKitKat(Intent data){
    String imagePath = null;
    Uri uri = data.getData();
    if(DocumentsContract.isDocumentUri(this,uri)){
        String docId = DocumentsContract.getDocumentId(uri);
        if("com.android.providers.media.documents".equals(uri.getAuthority())){
            String id = docId.split(":")[1];
            String selection = MediaStore.Images.Media._ID + "=" + id;
            imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
        }else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
            Uri contentUri = ContentUris.withAppendedId(Uri.parse("content:" +
                    "//downloads/public_downloads"),Long.valueOf(docId));
            imagePath = getImagePath(contentUri,null);
        }
    }else if("content".equalsIgnoreCase(uri.getScheme())){
        imagePath = getImagePath(uri,null);
    }else if("file".equalsIgnoreCase(uri.getScheme())){
        imagePath = uri.getPath();
    }
    displayImage(imagePath);
}

private void handleImageBeforeKitKat(Intent data){
    Uri uri = data.getData();
    String imagePath = getImagePath(uri,null);
    displayImage(imagePath);
}

private String getImagePath(Uri uri,String selection){
    String path = null;
    Cursor cursor = getContentResolver().query(uri,null,selection,
            null,null);
    if(cursor != null){
        if(cursor.moveToFirst()){
            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        }
        cursor.close();
    }
    return path;
}

private void displayImage(String imagePath){
    if(imagePath != null){
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        picture.setImageBitmap(bitmap);
    }else{
        Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
    }
}

}

哪位大神帮忙看一下,谢谢了

  • 写回答

2条回答 默认 最新

  • devmiao 2017-05-12 15:55
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突