如何从片段中获取onActivityResult的结果?

Hir*_*ela 17 android android-camera android-fragments

我已经Navigation drawer在每个项目中使用了我已经调用Fragments过的一个项目我已经Fragment在这个片段中调用了一个我需要从相机获取图片并将其设置为canvas background.在这里我捕获了相机图片但不知道如何在拍摄后获得这张照片并将其设置为画布背景.

片段代码

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.ssoft.admin.code.SharedPreferenceStore;
import com.ssoft.admin.code.Tools;
import com.ssoft.admin.salesmateco.FragSiteInspectionAdditional;
import com.ssoft.admin.salesmateco.R;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FragSignature extends Fragment implements View.OnClickListener {
    Button mSIBtnCamera;
    Fragment fragment;
    Tools mTools;
    private static final int RESULT_OK = 1;
    private static final int RESULT_CANCELED = 0;
    Uri imageUri = null;
    final int CAMERA_DATA = 100, INTENT_DATA = 1;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.frag_site_inspection_signature, null);
        mSIBtnCamera = (Button) rootView.findViewById(R.id.camera);
        mSIBtnCamera.setOnClickListener(this);

        return rootView;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.camera) {
            captureImage();
        }

        else {
            Toast.makeText(getActivity().getApplicationContext(),
                    "FragSIPhotos Add Button OnClick", Toast.LENGTH_SHORT)
                    .show();

        }
    }

    public void captureImage() {
        // Define the file-name to save photo taken by Camera activity

        String fileName = "Images.jpg";

        // Create parameters for Intent with filename

        ContentValues values = new ContentValues();

        values.put(MediaStore.Images.Media.TITLE, fileName);

        values.put(MediaStore.Images.Media.DESCRIPTION,
                "Image capture by camera");

        // imageUri is the current activity attribute, define and save it for
        // later usage

        Uri imageUri = getActivity().getApplicationContext()
                .getContentResolver()
                .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        /****
         * EXTERNAL_CONTENT_URI : style URI for the "primary" external storage
         * volume.
         ****/

        // Standard Intent action that can be sent to have the camera
        // application capture an image and return it.

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, INTENT_DATA);
        Log.e("captureImage()", "state -1");
        getActivity().startActivityForResult(intent, CAMERA_DATA);
        Log.e("captureImage()", "end");

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.e("OnActivityResult()", "1");

        if (requestCode == CAMERA_DATA) {
            Log.e("OnActivityResult()", "2");

            if (resultCode == RESULT_OK) {
                // Image captured and saved to fileUri specified in the Intent
                Log.e("OnActivityResult()", "3");
            } else if (resultCode == RESULT_CANCELED) {
                // User cancelled the image capture
                Log.e("OnActivityResult()", "4");
            } else {
                // Image capture failed, advise user
                Log.e("OnActivityResult()", "5");
            }
        }
        Log.e("OnActivityResult()", "6");
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("OnActivityResult()", "7");
    }

}
Run Code Online (Sandbox Code Playgroud)

Ars*_*ail 34

在Activity类中:

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

    super.onActivityResult(requestCode,resultCode,data);

}
Run Code Online (Sandbox Code Playgroud)

在片段中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){}
Run Code Online (Sandbox Code Playgroud)

选项1 :

如果你是startActivityForResult()从片段调用那么你应该调用startActivityForResult()not getActivity().startActivityForResult(),因为它会导致片段onActivityResult().

如果你不确定你在哪里打电话startActivityForResult()以及你将如何调用方法.

选项2:

由于Activity得到了结果onActivityResult(),因此您需要覆盖活动onActivityResult()并调用super.onActivityResult()以传播到未处理结果代码或所有数据的相应片段.

如果以上两个选项不起作用,那么请参考选项3,因为它肯定会起作用.

选项3:

从fragment到onActivityResult函数的显式调用如下

在Parent Activity类中,重写onActivityResult()方法,甚至在Fragment Class中覆盖它,并调用以下代码.

在活动中:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
Fragment fragment = getSupportFragmentManager().findFragmentById("yourFragment"); 
fragment.onActivityResult(requestCode, resultCode, data); 
}
Run Code Online (Sandbox Code Playgroud)

在片段中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   //in fragment class callback
}
Run Code Online (Sandbox Code Playgroud)


小智 6

代替

getActivity().startActivityForResult(intent, CAMERA_DATA);
Run Code Online (Sandbox Code Playgroud)

startActivityForResult(intent, CAMERA_DATA);
Run Code Online (Sandbox Code Playgroud)


Bha*_*iya 0

onActivityResult应该在Activity中实现,这个类就是你的Fragment。
在 FragmentActivity 中应用onActivityResult