imageview无法显示相机拍出来的照片

理想中程序:该应用有两个按钮,一个imageview。
一个按钮是调用手机相机拍照之后,剪裁该图片,然后显示在imageview中,但执行完剪裁之后并没有显示在imageview中。
另外一个按钮是打开相册,选取照片后剪裁图片之后再显示在imageview中。
但实际中出现问题:
1.第一个按钮在剪裁之后没有在imageview中显示。(但确定是已经执行了onActivityResult()方法中的显示imageview的方法了,,因为下面代码中加了一句通知能正常弹出来)
2.第二个按钮在打开相册之后没有进入剪裁图片的界面就直接跳回到主界面那里(但还是没有成功显示imageview)ps:因为书上例子是会进入剪裁界面的,但从代码里面看,我并不理解哪一句代码才是进入到剪裁界面。(第一个按钮会出现剪裁我知道)
下面就直接上代码了。就一个类!麻烦大家帮忙看看,感激不尽!!

 package com.example.choosepictext;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
    Button takephotobutton , choosephotobutton ;
    ImageView imageview ;
    private Uri imageuri ;
    public static final int TAKE_PHOTO = 1 ;
    public static final int CROP_PHOTO = 2 ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        takephotobutton = (Button)findViewById(R.id.takebutton);
        choosephotobutton = (Button)findViewById(R.id.choosebutton);
        imageview = (ImageView)findViewById(R.id.imageview);
        takephotobutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                File outputimage = new File(Environment.getExternalStorageDirectory(), "tempImage.jpg");
                try{
                    if(outputimage.exists()){
                        outputimage.delete();
                    }
                    outputimage.createNewFile();
                }catch(Exception e){}
                imageuri = Uri.fromFile(outputimage);//吧outputimage转成uri对象
                Log.v("Mylog","buttononclick:"+imageuri.getPath());
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//调用相机
                intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        }
        );
        choosephotobutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                File outputimage = new File(Environment.getExternalStorageDirectory(),"output_image.jpg");
                try{
                    if(outputimage.exists()){
                        outputimage.delete();
                    }
                    outputimage.createNewFile();
                }catch(IOException e )  {}
                imageuri = Uri.fromFile(outputimage);
                Intent intent = new Intent("android.intent.action.GET_CONTENT");
                intent.setType("image/*");
                intent.putExtra("crop", true);
                intent.putExtra("scale", true);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);
                startActivityForResult(intent, CROP_PHOTO);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode , int resultCode, Intent data){
        switch(requestCode){
        case TAKE_PHOTO:
            if(resultCode == RESULT_OK){
            Intent intent = new Intent("com.android.camera.action.CROP");//调用剪裁
            intent.setDataAndType(imageuri,"image/*");
            intent.putExtra("scale", true);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);
            Log.v("Mylog","result:"+imageuri.getPath());
            startActivityForResult(intent, CROP_PHOTO);
            }
            break ;
        case CROP_PHOTO:

            try{
                Log.v("Mylog","crop:"+imageuri.getPath());
                Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageuri));
                BitmapFactory.decodeFile(imageuri.getPath());
                imageview.setImageBitmap(bitmap);
                imageview.setVisibility(View.VISIBLE);
                Toast.makeText(MainActivity.this, "setImage", Toast.LENGTH_SHORT).show();

            }catch(FileNotFoundException e){}

                break ;
            default:
                break ;
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

5个回答

可能是你裁剪的图片大于你设置图片
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 500);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}

Android自定义裁切输出位置`MediaStore.EXTRA_OUTPUT可能有问题

bigname22
bigname22 应该是这个问题了,因为我在手机内存卡里发现,output_image虽然有生成,但是0kb的。请问有什么办法解决吗》?
接近 4 年之前 回复

我没有试不知道行不行,你试一试

bigname22
bigname22 哈哈,你发的那个网址里面下面就有我问那篇楼主的问题不过没有被回答。不过真的很谢谢你啦。有可能是我自己手机的问题吧,因为用我舍友的手机拍完的图片时能正确的存放到指定的位置的,就我的不行。总之很谢谢啦。(另外:我查到了:android4.4是分界,上是不传回真是地址的,而是一个封装过的uri,下是传回真实地址的。)总之还是非常感谢
接近 4 年之前 回复

没事,我也有在别人手机上不行,在自己手机行的,,你设置一下裁剪图片宽高试试,设小一点

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问