Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android調用系統相冊和相機選擇圖片並顯示在imageview中

Android調用系統相冊和相機選擇圖片並顯示在imageview中

編輯:關於Android編程

Android調用系統相冊和相機選擇圖片並顯示在imageview中,在系統調用相機拍攝中,直接返回的是經過壓縮處理後的圖像,當你直接把返還後的圖片放在imageview中時 圖片就會非常的模糊,所以要經過先存放在sd中,然後在處理並顯示。當調用系統相冊時,因為Android系統從4.4版本以後系統不再返回真實的uri路徑,而是封裝過後的uri路徑,所以當你寫代碼時必須注意,4.4是一個分水嶺,4.4以上的版本必須就通過解析和相應的處理才能獲取到真實的uri路徑。
先上程序運行的結果。
這個是調用系統相冊後的運行截圖。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
調用手機相機運行的截圖就不發了 ,你自己運行一下代碼就出了,
在程序中牽扯到對sd卡的操作,所以要在文件中注冊sd卡的權限<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">

首先建立xml文件:




    
        
        
        

    
    
        

        
        
            

在activity活動中我用到了PopWindow對其是相冊還是相機進行了選擇。
PopWindow的xml文件如下:



    
    
        
        
        

    
    
    
        
        
        

    


在activity中所有的代碼如下 一部分重要核心的代碼附帶有詳細的注釋:


public class MainActivity extends Activity {

    private Button button;
    private ImageButton imageButton_menu;
    private ImageView imageView_main;
    private FileInputStream is = null;
    public static Context activity;
    public static Uri uriImageview;
    private Bitmap bitmap_guiduhua;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        activity = this.getApplicationContext();
        //id綁定
        idBinding();
        //控件的點擊事件的設置
        onClick();
    }

    /**
     * activity布局文件中id的綁定
     */
    private void idBinding() {
        button = (Button) findViewById(R.id.bitton);
        imageButton_menu = (ImageButton)findViewById(R.id.main_imagebutton_menu);
        imageView_main = (ImageView)findViewById(R.id.main_imageview_tupian);
    }

    /**
     * 控件的點擊事件設置
     * 利用匿名類來注冊監聽事件
     */
    private void onClick() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                imageView_main.setImageBitmap(bitmap_guiduhua);
            }
        });

        imageButton_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("menu點擊----->","menu");
                MainMenuPopWindow mainMenuPopWindow = new MainMenuPopWindow(MainActivity.this);
                mainMenuPopWindow.showPopupWindow(imageButton_menu);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.e("requestCode---->", ""+requestCode);
        switch (requestCode){
            case 1:
                if (resultCode == RESULT_OK){
                    /**
                     * 判斷手機版本,因為在4.4版本都手機處理圖片返回的方法就不一樣了
                     * 4.4以後返回的不是真實的uti而是一個封裝過後的uri 所以要對封裝過後的uri進行解析
                     */

                    if (Build.VERSION.SDK_INT >=19){
                        //4.4系統一上用該方法解析返回圖片
                        handleImageOnKitKat(data);
                    }else{
                        //4.4一下用該方法解析圖片的獲取
                        handleImageBeforeKitKat(data);
                    }
                }
                break;
            case 2:
                Log.e("case2---->", "22222222222222222222");
                if (resultCode == RESULT_OK){
                    Intent intent = new Intent("com.android.camera.action.CROP");
                    intent.setDataAndType(uriImageview,"image/*");
                    intent.putExtra("scale",true);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,uriImageview);
                    startActivityForResult(intent,3);//啟動裁剪程序
                }
                break;
            case 3:
                if (resultCode == RESULT_OK){
                    try{
                        Log.e("case3---->", "3333333333333");
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                        .openInputStream(uriImageview));
                        //將裁剪後的圖片顯示出來
                        imageView_main.setImageBitmap(bitmap);
                        bitmap_guiduhua = huiDuHua(bitmap);
                    }catch (FileNotFoundException e){
                        e.printStackTrace();
                    }
                }
        }


    }

    /**
     * api 19以後
     *  4.4版本後 調用系統相機返回的不在是真實的uri 而是經過封裝過後的uri,
     * 所以要對其記性數據解析,然後在調用displayImage方法盡心顯示
     * @param data
     */

    private void handleImageOnKitKat(Intent data){
        String imagePath = null;
        Uri uri = data.getData();
        if (DocumentsContract.isDocumentUri(this,uri)){
            //如果是document類型的uri 則通過id進行解析處理
            String docId = DocumentsContract.getDocumentId(uri);
            if ("com.android.providers.media.documents".equals(uri.getAuthority())){
                //解析出數字格式id
                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".equals(uri.getScheme())){
            //如果不是document類型的uri,則使用普通的方式處理
            imagePath = getImagePath(uri,null);
        }
        displayImage(imagePath);
    }

    /**
     * 4.4版本一下 直接獲取uri進行圖片處理
     * @param data
     */
    private void handleImageBeforeKitKat(Intent data){
        Uri uri = data.getData();
        String imagePath = getImagePath(uri,null);
        displayImage(imagePath);
    }

    /**
     * 通過 uri seletion選擇來獲取圖片的真實uri
     * @param uri
     * @param seletion
     * @return
     */
    private String getImagePath(Uri uri, String seletion){
        String path = null;
        Cursor cursor = getContentResolver().query(uri,null,seletion,null,null);
        if (cursor != null){
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }

    /**
     * 通過imagepath來繪制immageview圖像
     * @param imagPath
     */
    private void displayImage(String imagPath){
        if (imagPath != null){
            Bitmap bitmap = BitmapFactory.decodeFile(imagPath);
            imageView_main.setImageBitmap(bitmap);
            bitmap_guiduhua = huiDuHua(bitmap);
        }else{
            Toast.makeText(this,"圖片獲取失敗",Toast.LENGTH_SHORT).show();
        }
    }

}

PopupWindow的作用就是從mainactivity中跳轉到相應系統的相冊或者相機界面:

public class MainMenuPopWindow extends PopupWindow{

    private View popView;
    private Uri uriImageview;


    public MainMenuPopWindow(final Activity context){

        LayoutInflater layoutInflater = (LayoutInflater)context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        popView = layoutInflater.inflate(R.layout.main_menu,null);
        //獲取寬高
        int h = context.getWindowManager().getDefaultDisplay().getHeight();
        int w = context.getWindowManager().getDefaultDisplay().getWidth();
        //設置彈出的popview視圖
        this.setContentView(popView);
        //設置彈出窗口的寬
        this.setWidth(w/2+20);
        //設置高度  為layout的自適應高度
        this.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT);
        //設置  pop可點擊可見
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        this.update();
        // 實例化一個ColorDrawable顏色為半透明
        ColorDrawable colorDrawable = new ColorDrawable(0000000000);
        // 點back鍵和其他地方使其消失,設置了這個才能觸發OnDismisslistener
        this.setBackgroundDrawable(colorDrawable);
        // 設置pop彈出窗體動畫效果
        this.setAnimationStyle(R.style.PopWindowAnimation);
        // 獲取SD卡路徑


        LinearLayout linearLayout_xiangce = (LinearLayout)popView.
                findViewById(R.id.linearlayout_mainmenu_xiangce);
        linearLayout_xiangce.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.e("xiangce---->","相冊");
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                context.startActivityForResult(intent, 1);
            }
        });

        LinearLayout linearLayout_paizhao = (LinearLayout)popView.
                findViewById(R.id.linearlayout_mainmenu_paizhao);
        linearLayout_paizhao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //以系統時間作為該文件 民命
                SimpleDateFormat formatter  =   new    SimpleDateFormat("yyyy年MM月dd日HH-mm-ss");
                Date curDate = new Date(System.currentTimeMillis());//獲取當前時間
                String    str    =    formatter.format(curDate);
                Log.e("拍照---->",str);
                //建立file文件用於保存來拍照後的圖片
                File outputFile = new File(Environment.getExternalStorageDirectory(),str+".jpg");
                /**
                 * 使用隱式intent進行跳轉
                 */
                try {
                    if (outputFile.exists()){
                        outputFile.delete();
                    }
                    outputFile.createNewFile();

                }catch (Exception e){
                    e.printStackTrace();
                }
                uriImageview = Uri.fromFile(outputFile);
                //另mainactivity的uri等於本.java 文件中的  uri
                MainActivity.uriImageview = uriImageview;
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT,uriImageview);
                //啟動相機程序
                context.startActivityForResult(intent,2);

            }
        });


    }

    /**
     * 設置  pop 的彈出位置
     * @param parent
     */
    public void showPopupWindow(View parent) {
        if (!this.isShowing()) {
            this.showAsDropDown(parent, parent.getLayoutParams().width / 2, 5);
        } else {
            this.dismiss();
        }
    }

}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved