package net.arvin.selector.uis.fragments; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.support.v4.content.FileProvider; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import net.arvin.selector.R; import net.arvin.selector.data.ConstantData; import net.arvin.selector.entities.FileEntity; import net.arvin.selector.utils.PSUtil; import java.io.File; import java.util.ArrayList; import java.util.Calendar; import static android.app.Activity.RESULT_OK; /** * Created by arvinljw on 18/1/4 17:38 * Function: * Desc: */ public class TakePhotoFragment extends BaseFragment { private String mImagePath; @Override protected int getLayout() { return R.layout.ps_fragment_take_photo; } @Override protected ArrayList<String> getSelectedPictures() { ArrayList<String> selectedPics = new ArrayList<>(); selectedPics.add(mImagePath); return selectedPics; } @Override protected ArrayList<String> getSelectedVideos() { return null; } @Override public void update(Bundle bundle) { init(null); } @Override protected void init(Bundle savedInstanceState) { initBaseInfo(getArguments()); choosePhotoFromCamera(); } private void choosePhotoFromCamera() { String dir = getTakePhotoDir(); File photoDir = new File(dir); if (!photoDir.exists()) { //noinspection ResultOfMethodCallIgnored photoDir.mkdirs(); } File mCurrentFile = new File(dir, getPhotoName()); mImagePath = mCurrentFile.toString(); Intent intent = getCameraIntent(mCurrentFile); startActivityForResult(intent, ConstantData.REQUEST_CODE_TAKE_PHOTO); getActivity().overridePendingTransition(0, 0); } private String getTakePhotoDir() { return PSUtil.getRootDir() + ConstantData.FOLDER_CAMERA; } private String getPhotoName() { return Calendar.getInstance().getTimeInMillis() + ".jpg"; } /** * 在manifest的application标签中加入配置 * <provider * android:name="android.support.v4.content.FileProvider" * android:authorities="换成包名.selector.provider" * android:exported="false" * android:grantUriPermissions="true"> * <meta-data * android:name="android.support.FILE_PROVIDER_PATHS" * android:resource="@xml/ps_file_paths" /> * </provider> * <p> * 上边的authorities属性值,需要与下面的FileProvider.getUriForFile(String,String,File)第二个参数一致 */ private Intent getCameraIntent(File f) { final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Uri imageUri = FileProvider.getUriForFile(getActivity(), mAuthorities, f);//通过FileProvider创建一个content类型的Uri intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI } else { intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); } return intent; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case ConstantData.REQUEST_CODE_TAKE_PHOTO: if (mSelectType == ConstantData.VALUE_TYPE_CAMERA) { if (mCanCrop) { if (mTransactionListener != null) { mTransactionListener.switchFragment(ConstantData.VALUE_CHANGE_FRAGMENT_CROP, ConstantData.toCropBundle(getArguments(), new FileEntity(mImagePath))); } } else { onEnsureClicked(); } } else { if (mTransactionListener != null) { mTransactionListener.switchFragment(ConstantData.VALUE_CHANGE_FRAGMENT_SELECTOR, ConstantData.toSelectorBundle(getArguments(), mImagePath, ConstantData.VALUE_CHANGE_FRAGMENT_TAKE_PHOTO)); } } PSUtil.scanFile(getActivity(), mImagePath); break; } return; } onBackClicked(); } @Override protected void onBackClicked() { if (mSelectType == ConstantData.VALUE_TYPE_CAMERA) { getActivity().onBackPressed(); return; } super.onBackClicked(); } }