80,351
社区成员
发帖
与我相关
我的任务
分享
//拍照常量
private final int REQUEST_IMAGE_CAPTURE = 1;
//方法,拍照
public void mTakePhoto()
{
Intent myIntent;
Uri myPictureUri;
//设定照相之后保存的路径和文件名。路径【kelingyi/kly/photo/】必须设定在 【provider_file_paths.xml】中,否则会出错闪退
File myPictureFile = new File(Environment.getExternalStorageDirectory() + "/kelingyi/kly/photo/",
"user_head.jpg");
// 判断当前系统,判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
myIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //读取权限
myIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //写入权限
//第二个参数,必须是 AndroidMainfest.xml中<provider>设定的【android:authorities="com.kelingyi.android_app.fileprovider"】
//在 MainActivity使用时,用 this 代替 gblContext
myPictureUri = FileProvider.getUriForFile(this,
"com.kelingyi.android_app.fileprovider",
myPictureFile);
} else {
myIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
myPictureUri = Uri.fromFile( myPictureFile );
}
//创建保存图片的路径【/kelingyi/kly/photo】(必须要事先创建好保存的路径,否则回调的 resultCode 一直是 RESULT_CANCELED)
//File myPhotoFolder = new File(Environment.getExternalStorageDirectory() + "/kelingyi/kly/photo/");
File myPhotoFolder = new File(Environment.getExternalStorageDirectory() + "/kelingyi/kly/", "photo");
//判断文件目录是否存在,不存在则创建
if (!myPhotoFolder.exists()) {
myPhotoFolder.mkdirs();
}
// 拍照。拍照的结果存到 myPictureUri 对应的路径中
myIntent.putExtra(MediaStore.EXTRA_OUTPUT,
myPictureUri);
//得到新打开Activity关闭后返回的数据。
//第二个参数为请求码,自己定义
startActivityForResult(myIntent,
REQUEST_IMAGE_CAPTURE);
}
//方法,拍照
//public void mTakePhoto()
//为了得到新打开Activity关闭后返回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
//参数:
// requestCode 请求码,即调用startActivityForResult()传递过去的值
// resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//在 MainActivity使用时,用 this 代替 gblContext
Toast.makeText(this,
"onActivityResult 回调 requestCode:【" + requestCode + "】 resultCode:【" + resultCode + "】",
Toast.LENGTH_LONG).show();
}
public class clsTakePhotoSelectImg extends AppCompatActivity {
//上下文
private Context gblContext;
//构造函数
public clsTakePhotoSelectImg(Context praContext)
{
gblContext = praContext;
}
//说明:以下代码,与MainActivity的唯一区别是,把 this 换成了 gblContext
//拍照
private final int REQUEST_IMAGE_CAPTURE = 1;
//方法,拍照
public void mTakePhoto()
{
Intent myIntent;
Uri myPictureUri;
//设定照相之后保存的路径和文件名。路径【kelingyi/kly/photo/】必须设定在 【provider_file_paths.xml】中,否则会出错闪退
File myPictureFile = new File(Environment.getExternalStorageDirectory() + "/kelingyi/kly/photo/",
"user_head.jpg");
// 判断当前系统,判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
myIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //读取权限
myIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //写入权限
//第二个参数,必须是 AndroidMainfest.xml中<provider>设定的【android:authorities="com.kelingyi.android_app.fileprovider"】
//在 MainActivity使用时,用 this 代替 gblContext
myPictureUri = FileProvider.getUriForFile(gblContext,
"com.kelingyi.android_app.fileprovider",
myPictureFile);
} else {
myIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
myPictureUri = Uri.fromFile( myPictureFile );
}
//创建保存图片的路径【/kelingyi/kly/photo】(必须要事先创建好保存的路径,否则回调的 resultCode 一直是 RESULT_CANCELED)
//File myPhotoFolder = new File(Environment.getExternalStorageDirectory() + "/kelingyi/kly/photo/");
File myPhotoFolder = new File(Environment.getExternalStorageDirectory() + "/kelingyi/kly/", "photo");
//判断文件目录是否存在,不存在则创建
if (!myPhotoFolder.exists()) {
myPhotoFolder.mkdirs();
}
// 拍照。拍照的结果存到 myPictureUri 对应的路径中
myIntent.putExtra(MediaStore.EXTRA_OUTPUT,
myPictureUri);
//得到新打开Activity关闭后返回的数据。
//第二个参数为请求码,自己定义
startActivityForResult(myIntent,
REQUEST_IMAGE_CAPTURE);
}
//方法,拍照
//public void mTakePhoto()
//为了得到新打开Activity关闭后返回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
//参数:
// requestCode 请求码,即调用startActivityForResult()传递过去的值
// resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//在 MainActivity使用时,用 this 代替 gblContext
Toast.makeText(gblContext,
"onActivityResult 回调 requestCode:【" + requestCode + "】 resultCode:【" + resultCode + "】",
Toast.LENGTH_LONG).show();
}
}
clsTakePhotoSelectImg myTakePhotoSelectImgObj = new clsTakePhotoSelectImg(MainActivity.this);
myTakePhotoSelectImgObj.mTakePhoto();
protected void onCreate(Bundle savedInstanceState)
{
......
//activity_main 上的按钮,id是 btn_camera
Button myBtnCamera;
myBtnCamera = (Button) findViewById(R.id.btn_camera);
//监听事件
myBtnCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//拍照
clsTakePhotoSelectImg.mTakePhoto(MainActivity.this);
}
});
......
}
//拍照常量
private final int REQUEST_IMAGE_CAPTURE = 1;
//为了得到新打开Activity关闭后返回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
//参数:
// requestCode 请求码,即调用startActivityForResult()传递过去的值
// resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Uri myPictureUri;
// 回调成功
//注意!必须要事先创建好保存的路径,否则回调的 resultCode 一直是 RESULT_CANCELED
if (resultCode == RESULT_OK) {
switch (requestCode) {
// 拍照
//private final int REQUEST_IMAGE_CAPTURE = 1;
//此时,照片已经保存在【/coma/kly/photo】
case REQUEST_IMAGE_CAPTURE:
Toast.makeText(this,
"onActivityResult 回调 拍照完成。requestCode:【" + requestCode + "】 resultCode:【" + resultCode + "】",
Toast.LENGTH_LONG).show();
//将照片上传到后台服务器
break;
}
}
以下是 clsTakePhotoSelectImg.java
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import java.io.File;
public class clsTakePhotoSelectImg{
//拍照
private static final int REQUEST_IMAGE_CAPTURE = 1;
//方法,拍照
public static void mTakePhoto(Activity praActivity)
{
Intent myIntent;
Uri myPictureUri;
//设定照相之后保存的路径和文件名。路径【coma/kly/photo/】必须设定在 【provider_file_paths.xml】中,否则会出错闪退
File myPictureFile = new File(Environment.getExternalStorageDirectory() + "/coma/kly/photo/",
"take_photo_by_kly.jpg");
// 判断当前系统,判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
myIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //读取权限
myIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //写入权限
//第二个参数,必须是 AndroidMainfest.xml中<provider>设定的【android:authorities="com.coma.android_app.fileprovider"】
//在 MainActivity使用时,用 this 代替 gblContext
myPictureUri = FileProvider.getUriForFile(praActivity,
"com.coma.android_app.fileprovider",
myPictureFile);
} else {
myIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
myPictureUri = Uri.fromFile( myPictureFile );
}
//创建保存图片的路径【/coma/kly/photo】(必须要事先创建好保存的路径,否则回调的 resultCode 一直是 RESULT_CANCELED)
File myPhotoFolder = new File(Environment.getExternalStorageDirectory() + "/coma/kly/", "photo");
//判断文件目录是否存在,不存在则创建
if (!myPhotoFolder.exists()) {
myPhotoFolder.mkdirs();
}
// 拍照。拍照的结果存到 myPictureUri 对应的路径中
myIntent.putExtra(MediaStore.EXTRA_OUTPUT,
myPictureUri);
//得到新打开Activity关闭后返回的数据。
//第二个参数为请求码,自己定义
praActivity.startActivityForResult(myIntent,
REQUEST_IMAGE_CAPTURE);
}
//方法,拍照
//public void mTakePhoto(...)
}
public static void mTakePhoto(Activity activity){
...
activity.startActivity...
}
//得到新打开Activity关闭后返回的数据。
//第二个参数为请求码,自己定义
startActivityForResult(myIntent,
REQUEST_IMAGE_CAPTURE);
我不知道怎么查详细的错误信息,在变量窗口里,ex=java.lang.NullPointerException