Android开发调取系统摄像头拍照并获取拍摄的图片上传服务器

Android开发调取系统摄像头拍照并获取拍摄的图片

最近自己弄了一个小项目,具体就是调用摄像头拍照并把照片上传到服务器

网络编程我用的是Okhttp框架,具体实现过程如下:
第一步:
定义一个HttpUtil类

public class HttpUtil {
    //Post请求
    public static void sendOkHttpPostRequest(String address, RequestBody requestBody, okhttp3.Callback callback){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(address).post(requestBody).build();
        client.newCall(request).enqueue(callback);
    }

}

第二步:
在方法中使用上面的类

private void saveToServer(File mFile) {
        String address = "http://122.51.247.132:8987/infer";
        RequestBody image = RequestBody.create(MediaType.parse("image/jpg"), mFile);
        //构建请求体
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("img",mFile.getName(),image)
                .build();
        HttpUtil.sendOkHttpPostRequest(address,requestBody,new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                Log.d(TAG, "onFailure: "+"访问失败");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String Text = response.body().string();
                Log.d(TAG, "onResponse: "+Text);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(Text);
                    }
                });
            }
        });
    }

调用摄像头拍照并获取照片过程
首先获取权限

if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED
                &&ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)
                {
                    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA
                ,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                }else {
                  SaveInSD();//或者调用SaveInHuanCun()
                }

拍照并获取图片,获取图片有两种获取方式
第一种:从缓存数据中获取图片,通过这种方式获取可以不用申请读写SD的权限

public void SaveInHuancun(){
        // 获取文件,getExternalCacheDir()方法用于获取应用关联缓存目录,即SD卡中专门用于存放当前应用缓存数据的位置
        outputImage = new File(getExternalCacheDir(),"picture.jpg");
        Log.d(TAG, "onClick: "+outputImage.getPath());
        try {
            if (outputImage.exists()){
                outputImage.delete();
            }
            outputImage.createNewFile();
        }catch (IOException e){
            e.printStackTrace();
        }
        //拍照后原图回存入此路径
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
            uri = Uri.fromFile(outputImage);
        } else {
            //7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider
            uri = getUriForFile(MainActivity.this, "com.example.picture.fileprovider", outputImage);
        }
        //启动相机拍照
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent, 1);
    }

第二种:从SD卡中获取拍摄图片,要申请SD卡读写权限

public void SaveInSD(){
        //判断SD卡是否存在
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)){
          String path = Environment.getExternalStorageDirectory().getPath();
          //创建拍摄图片的目录
          File file = new File(path+"/"+"scene");
          if (!file.exists()) {
              if (!file.mkdirs()) {
                  Toast.makeText(MainActivity.this, "创建目录失败!", Toast.LENGTH_SHORT).show();
              }
          }
              outputImage = new File(file.getAbsolutePath(), "/" + "picture" + ".jpg");
              //拍照后原图回存入此路径
              if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
                  uri = Uri.fromFile(outputImage);
              } else {
                  //7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider
                  uri = getUriForFile(MainActivity.this, "com.example.picture.fileprovider", outputImage);
              }
              //启动相机拍照
              Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
              intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
              intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
              startActivityForResult(intent, 1);
        }else {
            Toast.makeText(MainActivity.this,"未找到储存卡",Toast.LENGTH_SHORT).show();
        }
    }

特别注意:
通过应用缓存获取图片时共享路径file_paths为

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path path="Android/data/com.example.picture/cache/" name="files_root" />
</paths>

通过SD卡获取图片时共享路径file_paths为

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path path="scene/" name="files_root" />
</paths>

完整代码:

package com.example.picture;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.speech.tts.TextToSpeech;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Locale;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.Response;

import static android.support.v4.content.FileProvider.getUriForFile;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private Button button;
    private ImageView picture;
    private TextView textView;
    private File outputImage;
    private File file1=null;
    private Uri uri;
    private TextToSpeech tts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        picture = (ImageView)findViewById(R.id.pciture);
        button = (Button) findViewById(R.id.take_photo);
        textView = (TextView) findViewById(R.id.text);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED
                &&ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)
                {
                    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA
                ,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                }else {
                  SaveInHuancun();//或者调用SaveInSD()
                }
            }
        });
    }

    public void SaveInSD(){
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)){
          String path = Environment.getExternalStorageDirectory().getPath();
          File file = new File(path+"/"+"scene");
          if (!file.exists()) {
              if (!file.mkdirs()) {
                  Toast.makeText(MainActivity.this, "创建目录失败!", Toast.LENGTH_SHORT).show();
              }
          }
              outputImage = new File(file.getAbsolutePath(), "/" + "picture" + ".jpg");
              Log.d(TAG, "onClick: "+outputImage.getPath());
              //拍照后原图回存入此路径
              if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
                  uri = Uri.fromFile(outputImage);
              } else {
                  //7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider
                  uri = getUriForFile(MainActivity.this, "com.example.picture.fileprovider", outputImage);
              }
              Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
              intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
              intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
              startActivityForResult(intent, 1);
        }else {
            Toast.makeText(MainActivity.this,"未找到储存卡",Toast.LENGTH_SHORT).show();
        }
    }

    public void SaveInHuancun(){
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        // 获取文件
        outputImage = new File(getExternalCacheDir(),"picture.jpg");
        Log.d(TAG, "onClick: "+outputImage.getPath());
        try {
            if (outputImage.exists()){
                outputImage.delete();
            }
            outputImage.createNewFile();
        }catch (IOException e){
            e.printStackTrace();
        }
        //拍照后原图回存入此路径
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
            uri = Uri.fromFile(outputImage);
        } else {
            //7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider
            uri = getUriForFile(MainActivity.this, "com.example.picture.fileprovider", outputImage);
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent, 1);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

            if (requestCode==1) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                } else {
                    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                    startActivity(intent);
                }
            }

        }

        //将返回的图片显示出来
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == RESULT_OK) {
               try {
                   Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
                   picture.setImageBitmap(bitmap);
                   saveToServer(outputImage);
               }catch (FileNotFoundException e){
                   e.printStackTrace();
               }

        }
    }


    private void saveToServer(File mFile) {
        String address = "http://122.51.247.132:8987/infer";
        RequestBody image = RequestBody.create(MediaType.parse("image/jpg"), mFile);
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("img",mFile.getName(),image)
                .build();
        HttpUtil.sendOkHttpPostRequest(address,requestBody,new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                Log.d(TAG, "onFailure: "+"访问失败");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String Text = response.body().string();
                Log.d(TAG, "onResponse: "+Text);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(Text);
                    }
                });
            }
        });
    }

}


  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
我不确定您的问题是什么,但是如果您问如何使用 Android Studio 调取摄像头,您可以按照以下步骤进行: 1. 在 AndroidManifest.xml 文件中添加以下权限: <uses-permission android:name="android.permission.CAMERA"/> 2. 在 layout 文件中添加一个 SurfaceView 作为预览视图: <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent"/> 3. 在 Activity 中初始化摄像头的预览界面和回调: private SurfaceView mSurfaceView; private Camera mCamera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSurfaceView = findViewById(R.id.surfaceView); mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { mCamera = Camera.open(); try { mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); } catch (IOException e) { Log.e(TAG, "Error setting up camera preview.", e); } } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { // Empty method required by SurfaceHolder.Callback. } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { mCamera.stopPreview(); mCamera.release(); } }); } 4. 最后,在您需要调取摄像头时,调取以下方法即可: mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // Use data byte array for the image. } }); 希望这可以帮助您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值