android相片拼板源码,实现仿微信拍照和选取相片(转自网络)

本文介绍了如何在Android应用中创建一个自定义弹出窗口,实现从相册选择图片或拍照功能。主要展示了MainActivity中启动SelectPicPopupWindow的流程,并详细剖析了SelectPicPopupWindow中选择照片和拍照的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,首先MainActivity

package com.example.picpopupwindow;

import android.app.Activity;

import android.content.Intent;

import android.graphics.Bitmap;

import android.net.Uri;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

public class MainActivity extends Activity {

private ImageView photo;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

photo = (ImageView) this.findViewById(R.id.text);

// 把文字控件添加监听,点击弹出自定义窗口

photo.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数

startActivityForResult(new Intent(MainActivity.this,

SelectPicPopupWindow.class), 1);

}

});

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (resultCode) {

case 1:

if (data != null) {

//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意

Uri mImageCaptureUri = data.getData();

//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取

if (mImageCaptureUri != null) {

Bitmap image;

try {

//这个方法是根据Uri获取Bitmap图片的静态方法

image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);

if (image != null) {

photo.setImageBitmap(image);

}

} catch (Exception e) {

e.printStackTrace();

}

} else {

Bundle extras = data.getExtras();

if (extras != null) {

//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片

Bitmap image = extras.getParcelable("data");

if (image != null) {

photo.setImageBitmap(image);

}

}

}

}

break;

default:

break;

}

}

}

2,选择相片得activity。

package com.example.picpopupwindow;

import android.app.Activity;

import android.content.ActivityNotFoundException;

import android.content.Intent;

import android.os.Bundle;

import android.provider.MediaStore;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.Toast;

public class SelectPicPopupWindow extends Activity implements OnClickListener {

private Button btn_take_photo, btn_pick_photo, btn_cancel;

private LinearLayout layout;

private Intent intent;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.alert_dialog);

intent = getIntent();

btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);

btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);

btn_cancel = (Button) this.findViewById(R.id.btn_cancel);

layout = (LinearLayout) findViewById(R.id.pop_layout);

// 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity

layout.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",

Toast.LENGTH_SHORT).show();

}

});

// 添加按钮监听

btn_cancel.setOnClickListener(this);

btn_pick_photo.setOnClickListener(this);

btn_take_photo.setOnClickListener(this);

}

// 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity

@Override

public boolean onTouchEvent(MotionEvent event) {

finish();

return true;

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode != RESULT_OK) {

return;

}

//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用

if (data.getExtras() != null)

intent.putExtras(data.getExtras());

if (data.getData()!= null)

intent.setData(data.getData());

setResult(1, intent);

finish();

}

public void onClick(View v) {

switch (v.getId()) {

case R.id.btn_take_photo:

try {

//拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,

//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, 1);

} catch (Exception e) {

e.printStackTrace();

}

break;

case R.id.btn_pick_photo:

try {

//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,

//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个

Intent intent = new Intent();

intent.setType("image/*");

intent.setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(intent, 2);

} catch (ActivityNotFoundException e) {

}

break;

case R.id.btn_cancel:

finish();

break;

default:

break;

}

}

}

8235bcc55625a7c7910e1045864ea450.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值