如何在android中实现fragment中的摄像头功能?

如何在android中实现fragment中的摄像头功能?,android,android-fragments,android-studio,Android,Android Fragments,Android Studio,我在片段中有一个按钮。当调用该片段并单击该按钮时,我希望打开摄像机。我已经阅读了许多教程。但是我在fragment中找不到实现camera的解决方案 这是我的java代码camera.java: public class camera extends Fragment { private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; Button btnCapture; ImageView imageView; @Ov

我在
片段中有一个
按钮
。当调用该
片段
并单击该
按钮时,我希望打开
摄像机
。我已经阅读了许多教程。但是我在
fragment
中找不到实现
camera
的解决方案

这是我的java代码camera.java:

public class camera extends Fragment {

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
Button btnCapture;
ImageView imageView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.camera,
            container, false);
    btnCapture=(Button) rootView.findViewById(R.id.btnCapturePicture);
    //imageView = (ImageView) rootView.findViewById(R.id.imageview);

    btnCapture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent,
                    CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

        }
    });

    return rootView;

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {

            Bitmap bmp = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream stream = new ByteArrayOutputStream();

            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] byteArray = stream.toByteArray();

            // convert byte array to Bitmap

            Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
                    byteArray.length);

            imageView.setImageBitmap(bitmap);

        }
    }
}
}
以下是我的camera.xml布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:baselineAligned="false"
tools:context="com.example.prakash.eduqueri.fragments.camera">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:layout_gravity="center_vertical">
     <!--  Capture picture button
  -->
<Button
    android:id="@+id/btnCapturePicture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Take a Picture"
    android:layout_gravity="center_horizontal"
    android:layout_marginBottom="10dp" />

新日志:

Unable to decode stream: java.io.FileNotFoundException: /external/images/media/24097: open failed: ENOENT (No such file or directory)
04-12:43:02.688 29890-29890/com.example.prakash.edukeri/Adreno EGL::EGL 1.4高通公司构建:AU_LINUX_ANDROID_LNX.LA.3.5.2.2_RB1.04.04.04.154.004_msm8226_LNX.LA.3.5.2.2_RB1_release_AU() OpenGL ES着色器编译器版本:E031.24.00.15 建造日期:2014年6月8日星期三 本地分行:mybranch4057433 远程分支机构:quic/LNX.LA.3.5.2.2_rb1 本地修补程序:无 重构分支:AU_LINUX_ANDROID_LNX.LA.3.5.2.2_RB1.04.04.04.154.004+无 04-12 12:43:02.848 29890-29890/com.example.prakash.edukeri I/Timeline:Timeline:Activity\u idle id:android.os。BinderProxy@424bdc50时间:262597724

在您的按钮上添加此代码

int TAKE_OR_PICK = 1;
                    Intent takePictureIntent = new Intent(
                            MediaStore.ACTION_IMAGE_CAPTURE);
                    if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
                        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                    }
覆盖onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == getActivity().RESULT_OK && null != data  && TAKE_OR_PICK == 1) {
        imageView = (ImageView) findViewById(R.id.imageView1);
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        imageView.setImageBitmap(photo)
if (imageBitmap != null) {
            try {
                long fileName = System.currentTimeMillis();
                File outputFile = new File(Environment.getExternalStorageDirectory(), "photo_" + fileName + ".jpg");
                FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
                imageBitmap=Bitmap.createScaledBitmap(imageBitmap, 300, 300, true);
                imageBitmap.compress(Bitmap.CompressFormat.JPEG, 75, fileOutputStream);
                fileOutputStream.flush();
                fileOutputStream.close();
                File imageFile = new File(Environment.getExternalStorageDirectory() +File.separator + "photo_" + fileName + ".jpg");
                picturePath = imageFile.getPath();
                System.out.println("FILE PATH -> "+picturePath);
            }catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getActivity(), "Something went wrong", Toast.LENGTH_SHORT).show();
            }

        }
    }
}

您首先需要在父片段或活动中定义onActivityResult,如果当前片段位于另一个片段内,而该片段位于活动内,则首先在父片段和父activity内定义onResultActivity。我猜(当您使用viewPager时)您的片段很可能位于某个片段内,而父片段位于某个活动内,因此请遵循以下步骤:

首先在“活动”内部定义onActivityResult,然后定义片段,然后定义使用摄影机意图的片段

根父活动中的onActivityResult

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}
}

在子片段中:

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getChildFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }    super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onActivityResult(int requestCode, int resultCode, final Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
        if (resultCode == HomeActivity.RESULT_OK) {
try{
           BitmapFactory.Options options = new BitmapFactory.Options();

        // downsizing image as it throws OutOfMemory Exception for larger
        // images
        options.inSampleSize = 8;
        final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                options);

        imageView.setImageBitmap(bitmap); } catch (NullPointerException e) {
        e.printStackTrace();
    }           }
        } else if (resultCode == HomeActivity.RESULT_CANCELED) {
            // user cancelled Image capture
            Toast.makeText(getActivity(),
                    "User cancelled image capture", Toast.LENGTH_SHORT)
                    .show();
        } else {
            // failed to capture image
            Toast.makeText(getActivity(),
                    "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                    .show();
        }
}
注意:如果你的相机意图片段在这个片段中,那么你只需要再做一次,跳过这个步骤

现在,最后在您的Camerain帐篷片段中实现onActivityResult:

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getChildFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }    super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onActivityResult(int requestCode, int resultCode, final Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
        if (resultCode == HomeActivity.RESULT_OK) {
try{
           BitmapFactory.Options options = new BitmapFactory.Options();

        // downsizing image as it throws OutOfMemory Exception for larger
        // images
        options.inSampleSize = 8;
        final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                options);

        imageView.setImageBitmap(bitmap); } catch (NullPointerException e) {
        e.printStackTrace();
    }           }
        } else if (resultCode == HomeActivity.RESULT_CANCELED) {
            // user cancelled Image capture
            Toast.makeText(getActivity(),
                    "User cancelled image capture", Toast.LENGTH_SHORT)
                    .show();
        } else {
            // failed to capture image
            Toast.makeText(getActivity(),
                    "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                    .show();
        }
}
当摄像机意图启动时,fileUri变量在单击按钮时初始化

最后,在启动照相机意图时,必须使用
getParentFragment()

因此,您的明星意向如下所示:

  btnCapture.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        String fileName = System.currentTimeMillis()+".jpg";
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, fileName);
    fileUri = getActivity().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        getParentFragment().startActivityForResult(intent,
                CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

    }
});
在上面的方法中,fileUri是一个字符串类型变量,在方法外部定义,因为它应该用于设置图像的预览,如onActivityResult()所示


希望这会有所帮助,如果您遇到任何问题,请发表评论,我将帮助您:)
愉快地编码:)

至少展示一下您所做的。您是否需要实现摄像头本身?如果轮子是阿尔迪发明的,为什么还要再发明它呢?改为启动cameraintent,并将拍摄的照片拍摄回来。相机打开时,我遇到一个错误无法继续活动我遇到的错误是因为布局文件中没有imagepreview小部件。现在我清除了它。如何将我捕获的照片保存到内存中?请检查更新的答案。如果您帮助此图片未存储在内存中,请接受并投票我的答案。位图bmp=(位图)fileUri.getData()行中出现错误。它说无法解析方法getData(),或者我的坏忘记编辑onActivityResult(),请检查onActivity结果,现在它将在getParentFragment()处处理finenull指针异常。当我移除它时,它工作正常,并且图像成功地存储在sd卡中。但无法获取图像预览意味着您没有正确处理父活动和片段中的onActivityResult,要获取预览,您必须在父活动和片段中处理onActivityResult,正如我在上面所示,如果您在onResume()方法中检查图像,只需在(resultCode==…)并使用一个if条件在onResume内部复制,就像(fileUri!=null){//通过onActivityResult}处理的代码,这将生成图像预览,确保imageView是公共的。