2017-04-20 92 views
-1

我知道有很多这样的帖子,但我的是一个有点特别。Android - ImageView/ImageButton与画廊或相机的图像

问题描述:

我希望有一个公共类,显示一个小对话框,选择图像源,相机或画廊。选择后,ImageView将显示图像,图像将保存在应用程序文件夹中。这个课程将从许多活动中调用。所以,我有这样的代码:

PhotoActivity.java

package com.app.test; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.provider.MediaStore; 

import java.util.ArrayList; 
import java.util.List; 


public class PhotoActivity { 

    private Context context; 

    public PhotoActivity(Context current){ 
     this.context = current; 
    } 
    //this will be called from other activities 
    public void Change_Photo(final Activity a) { 

     List<String> options = new ArrayList<String>(); 
     options.add(context.getResources().getString(R.string.camera)); 
     options.add(context.getResources().getString(R.string.gallery)); 
     options.add(context.getResources().getString(R.string.cancel)); 

     //Create sequence of items 
     final CharSequence[] Sources = options.toArray(new String[options.size()]); 
     AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); 
     dialogBuilder.setTitle(context.getResources().getString(R.string.select_image_source)); 
     dialogBuilder.setItems(Sources, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       if (item==0) {//camera 
        Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        a.startActivityForResult(takePicture, 0);//zero can be replaced with any action code 
       }else if (item == 1) {//gallery 
        Intent pickPhoto = new Intent(Intent.ACTION_PICK, 
          android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        a.startActivityForResult(pickPhoto , 1);//one can be replaced with any action code 
       } 
      } 
     }); 
     //Create alert dialog object via builder 
     AlertDialog alertDialogObject = dialogBuilder.create(); 
     //Show the dialog 
     alertDialogObject.show(); 
    } 
} 

我加在清单文件:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 

其他activites有一个ImageView的或ImageButton的是这样的:

<ImageButton 
     android:id="@+id/btn_picture" 
     android:layout_width="140dp" 
     android:layout_height="140dp" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="false" 
     android:elevation="0dp" 
     android:gravity="center_horizontal" 
     android:src="@drawable/camera" /> 

它在开始时有相机图像,但会s最终如何选择图像。

下一步必须做什么才能显示此ImageButton中选定或拍摄的照片?

回答

0
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 
Uri uri = data.getData(); 
try { 
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
// imageButton where you want to set image 
imageButton.setImageBitmap(bitmap); 
} catch(IOException e) { 
e.printStackTrace(); 
} 
} 

这是如何在ImageButton上设置所选/捕获的图像。

希望这会有所帮助。

+1

比getBitmap()和setImageBitmap()更好的选择是使用[图像加载库](https://android-arsenal.com/tag/46),如毕加索。答案中显示的代码在主应用程序线程上加载图像,这会冻结UI。 – CommonsWare

+0

这样做的工作。一个小问题。当我拍摄一张新照片时,ImageButton显示它向左旋转90度。为什么? –

+0

这取决于照片的大小,拍一张小照片,然后重试 –