Android中使用相机和相册获取照片,模仿朋友圈发说说

话不多说,直接上图,如图:

这个功能相信很多人都会用到,下面来一步一步的设置这个功能。

1:首先布局我们的主界面,这里我使用activity_edit_diary.xml文件来当布局文件;

     文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:orientation="vertical">

    <!--写日记头部标题栏-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_bar_height"
        android:background="@drawable/bg_color_white">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="写日记"
            android:textColor="@color/titleBlack"
            android:textSize="@dimen/title_bar_title_size" />

        <ImageView
            android:id="@+id/edit_diary_back"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/title_bar_height"
            android:layout_alignParentStart="true"
            android:layout_centerInParent="true"
            android:contentDescription="@string/word_back"
            android:onClick="onClick"
            android:paddingStart="16dp"
            android:src="@drawable/nav_icon_return_black" />

        <TextView
            android:id="@+id/send_diary"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/title_bar_height"
            android:layout_alignParentEnd="true"
            android:layout_centerInParent="true"
            android:contentDescription="发送"
            android:gravity="center"
            android:paddingEnd="16dp"
            android:text="发送"
            android:textColor="@color/textColor"
            android:textSize="15sp" />

    </RelativeLayout>

    <!--头标题下的下划线-->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/loginLine" />

    <!--写日记,上传照片等输入框-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:orientation="vertical">

        <EditText
            android:id="@+id/edit_diary_text"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@color/white"
            android:gravity="top"
            android:hint="说点什么吧..."
            android:maxLines="5"
            android:textSize="13sp" />

        <!--GridView高度是自适应-->
        <GridView
            android:id="@+id/picture_gridView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="3" />

        <!--可见范围-->
        <LinearLayout
            android:id="@+id/public_secret_layout"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginTop="10dp"
            android:background="@color/white"
            android:gravity="center"
            android:orientation="horizontal">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="可见范围:" />

            <TextView
                android:id="@+id/public_secret_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="公开" />

            <ImageView
                android:id="@+id/public_secret"
                android:layout_width="22dp"
                android:layout_height="22dp"
                android:src="@drawable/icon_arrow1" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

2:布局我们的弹框,我设置的弹框名为pop_edit_diary.xml文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#99444444"
    android:fitsSystemWindows="true"
    android:gravity="center|bottom"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardCornerRadius="13dp"
        app:cardElevation="0dp">

        <LinearLayout
            android:layout_width="340dp"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:gravity="center"
            android:orientation="vertical">

            <!--如果不加这层布局那么就会报错-->
            <LinearLayout
                android:id="@+id/public_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/public_text"
                    android:layout_width="match_parent"
                    android:layout_height="57dp"
                    android:gravity="center"
                    android:text="公开"
                    android:textColor="@color/takePhoto"
                    android:textSize="20sp" />

                <View
                    android:layout_width="match_parent"
                    android:layout_height="1dp"
                    android:background="@color/viewGrays" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/secret_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/secret_text"
                    android:layout_width="match_parent"
                    android:layout_height="57dp"
                    android:gravity="center"
                    android:text="秘密"
                    android:textColor="@color/takePhoto"
                    android:textSize="20sp" />
            </LinearLayout>

        </LinearLayout>

    </android.support.v7.widget.CardView>

    <android.support.v7.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        app:cardCornerRadius="13dp"
        app:cardElevation="0dp">

        <LinearLayout
            android:id="@+id/cancel_public_secret_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/cancel_public_secret"
                android:layout_width="340dp"
                android:layout_height="57dp"
                android:gravity="center"
                android:text="取消"
                android:textColor="@color/takePhoto"
                android:textSize="20sp" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

3:基本的布局都设置好了之后下面就是我们的重点界面了:主界面是EditDiaryActivity.java,

   文件中的代码如下:

package com.choicelean.superwinner.activity;

import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

import com.choicelean.superwinner.R;
import com.choicelean.superwinner.util.ImageTool;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class EditDiaryActivity extends AppCompatActivity implements View.OnClickListener {

    private static final int IMG_COUNT = 10;
    private static final String IMG_ADD_TAG = "a";
    private GridView gridView;
    private GVAdapter adapter;
    private TextView textView;
    private List<String> list;
    private EditText editDiaryText;
    private ImageView editDiaryBack;
    private LinearLayout publicSecretLayout;
    private TextView publicSecretText;

    //弹窗设置
    View popUp;
    private PopupWindow popupWindow;

    //弹窗中调用摄像头拍照
    public static final int TAKE_PHOTO = 1;
    //弹窗中调用相册
    public static final int TAKE_ALBUM = 0;

    private ImageView picture;
    private Uri imageUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_diary);
        initView();
        initData();
    }

    private void initView() {
        gridView = (GridView) findViewById(R.id.picture_gridView);
        textView = (TextView) findViewById(R.id.send_diary);
        editDiaryText = (EditText) findViewById(R.id.edit_diary_text);
        editDiaryBack = (ImageView) findViewById(R.id.edit_diary_back);
        publicSecretLayout = (LinearLayout) findViewById(R.id.public_secret_layout);
        publicSecretText = (TextView) findViewById(R.id.public_secret_text);

        editDiaryBack.setOnClickListener(this);
        textView.setOnClickListener(this);
        publicSecretLayout.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.edit_diary_back:
                finish();
                break;
            case R.id.send_diary:
                Toast.makeText(this, "发送", Toast.LENGTH_SHORT).show();
                break;
            case R.id.public_secret_layout:
                initPopUp();
                break;
            default:
                break;
        }
    }

    private void initData() {
        if (list == null) {
            list = new ArrayList<>();
            list.add(IMG_ADD_TAG);
        }
        adapter = new GVAdapter();
        gridView.setAdapter(adapter);
        //下面给gridView添加一个选择器,使得点击的时候背景色不变
        gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (list.size() < IMG_COUNT) {
                    //这里进行对点击事件判断是调用相册还是相机
                    initImagePopUp();

                } else {
                    Toast.makeText(EditDiaryActivity.this, "最多只能选择9张照片", Toast.LENGTH_SHORT).show();
                }
            }
        });
        refreshAdapter();
    }

    private void refreshAdapter() {
        if (list == null) {
            list = new ArrayList<>();
        }
        if (adapter == null) {
            adapter = new GVAdapter();
        }
        adapter.notifyDataSetChanged();
    }

    /**
     * GridView适配器
     */
    private class GVAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView = LayoutInflater.from(getApplication()).inflate(R.layout.activity_edit_diary_select_photo_item, parent, false);
                holder = new ViewHolder();
                holder.imageView = (ImageView) convertView.findViewById(R.id.main_gridView_item_photo);
                holder.nullView = (ImageView) convertView.findViewById(R.id.null_view);
                holder.checkBox = (CheckBox) convertView.findViewById(R.id.main_gridView_item_cb);
                //去掉CheckBox原来的边框
                holder.checkBox.setButtonDrawable(new ColorDrawable(Color.TRANSPARENT));
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            String s = list.get(position);
            if (!s.equals(IMG_ADD_TAG)) {
                holder.checkBox.setVisibility(View.VISIBLE);
                holder.nullView.setVisibility(View.GONE);
                holder.imageView.setImageBitmap(ImageTool.createImageThumbnail(s));
                holder.imageView.setVisibility(View.VISIBLE);
            } else {
                holder.checkBox.setVisibility(View.GONE);
                holder.nullView.setVisibility(View.VISIBLE);
                //在这里进行判断如果当前是待加载状态就隐藏当前控件
                holder.imageView.setVisibility(View.GONE);
                //原来加上这个总是显示图片太大
                // holder.imageView.setImageResource(R.drawable.icon_add);
            }
            holder.checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    list.remove(position);
                    refreshAdapter();
                }
            });
            return convertView;
        }

        private class ViewHolder {
            ImageView nullView;
            ImageView imageView;
            CheckBox checkBox;
        }

    }

    /**
     * 选择相册中的选项获取返回的数据
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //加下面这段摄像头拍的照片显示不出来,因为摄像头拍的照片保存使用到内容提供者了,返回的数据为空。
//        if (data == null) {
//            System.out.println("data null");
//            return;
//        }
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    final Uri uri = imageUri;
                    String path = ImageTool.getImageAbsolutePath(this, uri);
                    if (list.size() == IMG_COUNT) {
                        removeItem();
                        refreshAdapter();
                        return;
                    }
                    removeItem();
                    list.add(path);
                    list.add(IMG_ADD_TAG);
                    refreshAdapter();
                    //这里先弹出一个吐司
                    Toast.makeText(this, "调用摄像头结束", Toast.LENGTH_SHORT).show();
                }
                break;
            //调用相册获取照片
            case TAKE_ALBUM:
                if (resultCode == RESULT_OK) {
                    final Uri uri = data.getData();
                    String path = ImageTool.getImageAbsolutePath(this, uri);
                    System.out.println(path);
                    if (list.size() == IMG_COUNT) {
                        removeItem();
                        refreshAdapter();
                        return;
                    }
                    removeItem();
                    list.add(path);
                    list.add(IMG_ADD_TAG);
                    refreshAdapter();
                }
                break;
            default:
                break;
        }
        //数据回调后关闭弹窗
        popupWindow.dismiss();


    }

    private void removeItem() {
        if (list.size() != IMG_COUNT) {
            if (list.size() != 0) {
                list.remove(list.size() - 1);
            }
        }
    }


    /**
     * 从这里开始加载可见范围弹框的
     */

    private void initPopUp() {
        initAd();
        showPopUp();
    }

    /**
     * --------------弹窗显示-----------------
     */
    private void showPopUp() {
        if (popupWindow.isShowing()) {
            popupWindow.dismiss();
        }
        popupWindow.showAtLocation(popUp, Gravity.BOTTOM, 0, 0);
    }

    //初始化弹框
    private void initAd() {
        popUp = getLayoutInflater().inflate(R.layout.pop_edit_diary, null);
        popupWindow = new PopupWindow(popUp, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);
        popupWindow.setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return false;
            }
        });
        initEvents();
    }

    private void initEvents() {
        popUp.findViewById(R.id.cancel_public_secret_layout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });

        //调用摄像头拍照
        popUp.findViewById(R.id.public_layout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                publicSecretText.setText("公开");
                popupWindow.dismiss();
            }
        });
        popUp.findViewById(R.id.secret_layout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                publicSecretText.setText("秘密");
                popupWindow.dismiss();
            }
        });
    }


    /**
     * 从这里开始加载照片选择弹框的
     */
    private void initImagePopUp() {
        initImageAd();
        showImagePopUp();
    }

    /**
     * --------------照片选择弹窗显示-----------------
     */
    private void showImagePopUp() {
        if (popupWindow.isShowing()) {
            popupWindow.dismiss();
        }
        popupWindow.showAtLocation(popUp, Gravity.BOTTOM, 0, 0);
    }

    //初始化选择照片弹框
    private void initImageAd() {
        popUp = getLayoutInflater().inflate(R.layout.pop_user_info, null);
        popupWindow = new PopupWindow(popUp, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);
        popupWindow.setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return false;
            }
        });
        initImageEvents();
    }

    private void initImageEvents() {
        popUp.findViewById(R.id.cancel_take_photo_layout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });

        //调用摄像头拍照
        popUp.findViewById(R.id.take_photo_layout).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(EditDiaryActivity.this,
                            "com.choicelean.superwinner.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);
                popupWindow.dismiss();
            }
        });

        //调用相册选取照片
        popUp.findViewById(R.id.camera_layout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(i, TAKE_ALBUM);
                popupWindow.dismiss();
            }
        });
    }

}

4:这里使用到了GridView,自然想到设置一个子项布局用来存放每一张图片子项布局名为activity_edit_diary_select_photo:

   代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="110dp"
    android:layout_height="110dp"
    android:layout_gravity="center"
    android:gravity="center">

    <com.choicelean.superwinner.component.SquareRelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="110dp"
        android:layout_height="110dp">

        <FrameLayout
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:layout_centerInParent="true"
            android:background="#FFF5F5F5">
            <ImageView
                android:id="@+id/null_view"
                android:layout_width="22dp"
                android:layout_height="22dp"
                android:src="@drawable/icon_add"
                android:layout_gravity="center"/>
            <ImageView
                android:id="@+id/main_gridView_item_photo"
                android:layout_width="90dp"
                android:layout_height="90dp"
                android:layout_centerInParent="true"
                android:layout_gravity="center"
                android:scaleType="fitXY" />
        </FrameLayout>
        <CheckBox
            android:id="@+id/main_gridView_item_cb"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:background="@drawable/growup_close"
            android:gravity="center" />
    </com.choicelean.superwinner.component.SquareRelativeLayout>
</LinearLayout>

5:这里获取拍照的照片的时候使用到内容提供者:所以在我们的清单文件中添加如下代码:

<!-- 这个内容提供者是在上面的EditDiaryActivity中的 -->
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.choicelean.superwinner.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

6:使用内容提供者就想到了图片的存放路径,故在我们的res文件下新建一个包取名为xml,在包下新建file_paths.xml文件:

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!--下面的这个path路径不写就是默认SD卡的路径,也可以只写我们放图片的路径上-->
    <external-path name="my_images" path=""/>
</paths>

7:最后一步在我们的清单文件中别忘了声明权限:

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

   
 

猜你喜欢

转载自blog.csdn.net/qq_42618969/article/details/81262348
今日推荐