1

我正在使用自定义相机(使用Surfaceview等)的应用程序,我从我的ObjectActivity中使用startActivityForResult转到名为CameraActivity的相机的活动。这发生在这种方法中。startActivityForResult返回到错误的活动

public void addPicture(View v) { 
    final CharSequence[] items = { "Take Photo", "Choose from Gallery", "Cancel" }; 
    AlertDialog.Builder builder = new AlertDialog.Builder(ObjectActivity.this); 
    builder.setTitle("Add Photo!"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int item) { 
      if (items[item].equals("Take Photo")) { 
       executeOnResume = false; 
       if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
        int hasWriteExternalStoragePermission = checkSelfPermission(Manifest.permission.CAMERA); 
        if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED) { 
         requestPermissions(new String[]{Manifest.permission.CAMERA}, 
           REQUEST_CODE_ASK_PERMISSIONS); 
        } 
       } 
       Intent intent = new Intent(ObjectActivity.this,CameraActivity.class); 
       startActivityForResult(intent, REQUEST_CAMERA); 
      } else if (items[item].equals("Choose from Gallery")) { 
       executeOnResume = false; 
       Intent intent = new Intent(
         Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       intent.setType("image/*"); 
       startActivityForResult(
         Intent.createChooser(intent, "Select File"), 
         REQUEST_SELECT_FILE); 
      } else if (items[item].equals("Cancel")) { 
       dialog.dismiss(); 
      } 
     } 
    }); 
    builder.show(); 
} 

更具体地讲,它发生在这几行:

Intent intent = new Intent(ObjectActivity.this,CameraActivity.class); 
startActivityForResult(intent, REQUEST_CAMERA); 

这工作得很好,但是当我试图拍照,这恰好这里后返回ObjectActivity:

Camera.PictureCallback mPicture = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     //TODO Code to process picture taken 
     //create a new intent... 
     Intent intent = new Intent(); 
     intent.putExtra("data",data); 
     //close this Activity... 
     setResult(Activity.RESULT_OK, intent); 
     finish(); 
    } 
}; 

它返回到名为MainActivity的ObjectActivity之前的活动,而它应该返回到ObjectActivity并调用onActivityResult():

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    executeOnResume = false; 
    loadStuff(); 
    if (resultCode == RESULT_OK) { 
     if (requestCode == REQUEST_CAMERA || requestCode == REQUEST_SELECT_FILE) { 
      AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
      alertDialog.setTitle("Description"); 
      alertDialog.setMessage("Enter Description"); 
      final EditText input = new EditText(this); 
      alertDialog.setView(input); 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT, 
        LinearLayout.LayoutParams.MATCH_PARENT); 
      input.setLayoutParams(lp); 
      alertDialog.setView(input); 
      alertDialog.setPositiveButton("Ok", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          description = input.getText().toString(); 
          if (description == null || description.equals("")) { 
           description = "-"; 
          } 
          try { 
           savePhoto(requestCode,data); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
      final AlertDialog.Builder tmpDialog = alertDialog; 

      final AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); 
      dlgAlert.setTitle("Direction"); 
      dlgAlert.setMessage("Stand with your phone facing the same direction as the picture made and press Ok"); 
      dlgAlert.setPositiveButton("Ok", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          mBearingProvider.updateBearing(); 
          bearing = mBearingProvider.getBearing(); 
          cardinalDirection = bearingToString(bearing); 
          Log.e("Direction", cardinalDirection + "," + bearing); 
          tmpDialog.create().show(); 
          dialog.dismiss(); 
         } 
        }); 
      dlgAlert.setNegativeButton("Cancel", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          tmpDialog.create().show(); 
         } 
        }); 
      dlgAlert.create().show(); 
     } 
    } 
} 

但它永远不会到达那里。 有谁知道为什么会发生这种情况?

+0

是否使用GroupActivity? – Dinash

+0

ObjectActivity和CameraActivity都是常规活动,MainActivity是AppCompatActivity,所以据我所知我没有使用GroupActivity –

回答

0

我已经找到了解决办法,如果我不与意图送过来一个byte [](而是也许写出来一个文件并发送该文件的路径与意图),代码似乎工作和ObjectActivity打开。

部分我删除/修改:

intent.putExtra("data",data); 

我不知道为什么这个作品,我想知道为什么,但现在我很高兴它的工作原理。

1

摆脱getParent。您想要设置当前活动的结果,而不是您的父母。所以更换:

//close this Activity... 
    if (getParent() == null) { 
     setResult(Activity.RESULT_OK, intent); 
    } else { 
     getParent().setResult(Activity.RESULT_OK, intent); 
    } 

setResult(Activity.RESULT_OK, intent); 
+0

我想我已经试过了,但我会再试一次 –

+2

设置父级的结果是绝对的100%错误。 –

+0

这可能是真的,但这不是解决方案,我得到了同样的结果 –

相关问题