簡體   English   中英

onActivityResult不是從選項卡片段調用

[英]onActivityResult is not calling from tab fragment

我在MainActivity中實現了3標簽。 第一個選項卡是圖像片段,其中實現了2個按鈕。 第一是打開相機,第二是打開圖庫。 我想在稱為“上載活動”的新活動中顯示該捕獲或選定的圖像。

圖像片段

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    //  return inflater.inflate(R.layout.fragment_images, container, false);
    View v = inflater.inflate(R.layout.fragment_images, container, false);
    FloatingActionButton btnCamera = (FloatingActionButton) v.findViewById(R.id.btnCamera);
    FloatingActionButton btnFolder = (FloatingActionButton) v.findViewById(R.id.btnFolder);

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

            File imageFolder = new File(Environment.getExternalStorageDirectory(), "/My Children");
            imageFolder.mkdir();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd");
            String timestamp = simpleDateFormat.format(new Date());
            File image = new File(imageFolder, timestamp+ ".jpg");
            //    Uri uriImage = Uri.fromFile(image);
            Uri uriImage = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID +  ".provider", image);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);
            getActivity().startActivityForResult(intent, TAKE_PICTURE);
        }
    });
    btnFolder.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            getActivity().startActivityForResult(intent, SELECT_PICTURE);
        }
    });
    return v;

}
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 try {
if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {
    Bundle extras = data.getExtras();
    Bitmap cam = (Bitmap) extras.get("data");
    Intent i = new Intent().setClass(getActivity(), Upload.class);
    i.putExtra("image", cam);
    startActivity(i);
}
if (requestCode == SELECT_PICTURE && requestCode == RESULT_OK) {
    Bitmap bitmap = (Bitmap) data.getExtras().get("data");
    Intent i = new Intent(getActivity(), Upload.class);
    i.putExtra("image", bitmap);
    startActivity(i);
}
}catch (Exception e){
e.printStackTrace();
}

還在MainActivity中添加了此代碼

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Fragment page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.vp_pages + ":" + vp_pages.getCurrentItem() );
    if (page != null){
        page.onActivityResult(requestCode, resultCode, data);
    }
}

這是我要顯示圖像的上載類

public class Upload extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_upload);

    Button btnUpload = (Button) findViewById(R.id.btnUpload);

    ImageView imageview = (ImageView) findViewById(R.id.imageview);
    Intent intent = getIntent();
    Bitmap bitmap = (Bitmap) intent.getParcelableExtra("image");
    imageview.setImageBitmap(bitmap);
 }
 }

捕獲或選擇圖像后,將打開“圖像”片段,而不是“上載活動”。

由於要從圖像片段啟動相機或圖庫圖像捕獲,因此只能從那里啟動Intent。

但是問題是,當您設置

intent.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);

由於您已經指定了自己的uri,因此onActivityResult中的數據將為null。 因此,對於攝像機請求,您可以通過將其全局存儲在temp uri中來進行檢查。

Uri cameraUri;

接着

cameraUri = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID +  ".provider", image);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
            getActivity().startActivityForResult(intent, TAKE_PICTURE);

目前,uri是指一些臨時文件。 相機只需單擊並覆蓋該文件即可成為有效文件。

所以現在得到如下結果。

@Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) {
         Intent i = new Intent().setClass(getActivity(), Upload.class);
         //here pass the original uri that we stored while starting camera
         i.putExtra("image", cameraUri.toString());
         startActivity(i);
      }
      if (requestCode == SELECT_PICTURE && requestCode == RESULT_OK) {
         Intent i = new Intent(getActivity(), Upload.class);
         //this will return you data in case of open gallery
         i.putExtra("image", data.getData().toString());
         startActivity(i);
     }
    }

現在在另一個活動上,只需接收並顯示

public class Upload extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_upload);

    Button btnUpload = (Button) findViewById(R.id.btnUpload);

    ImageView imageview = (ImageView) findViewById(R.id.imageview);
    Intent intent = getIntent();
    if(intent==null){
     return;
    }
    Uri imageUri = Uri.parse(intent.getStringExtra("image"));
    imageview.setImageURI(imageUri);
 }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM