Android 调用ActivityResult()时出错

Android 调用ActivityResult()时出错,android,bitmap,onactivityresult,Android,Bitmap,Onactivityresult,我有两个活动A和B,它们都在使用onActivityResult() 过程: 工作区中的onActivityResult() 在活动B中,我有两个onActivityResult()(如下代码所示)。第一个是可单击的文本视图,也可以正常工作。另一个为按钮 我面临的问题是按钮,它假设从B的子活动中获取位图,并显示在B的ImageView中。当我单击按钮时,它会将我带到活动A的onActivityResult() startActivityForResult()在活动B的按钮中: int capSi

我有两个活动A和B,它们都在使用
onActivityResult()

过程:

  • 工作区中的onActivityResult()
  • 在活动B中,我有两个
    onActivityResult()
    (如下代码所示)。第一个是可单击的
    文本视图
    ,也可以正常工作。另一个为
    按钮
  • 我面临的问题是按钮,它假设从B的子活动中获取位图,并显示在B的ImageView中。当我单击按钮时,它会将我带到活动A的
    onActivityResult()

    startActivityForResult()
    在活动B的按钮中:

    int capSig = arg0.getId();
    if(capSig == R.id.capSig)      //Button  which takes me to sub-activity of B
    {
        Intent goToCapSignatures = new Intent(this, CaptureSignature.class);
        startActivityForResult(goToCapSignatures, GET_SIG);
    
    }
    
    Bitmap returnedBitmap = Bitmap.createBitmap(mContent.getWidth(),
                     mContent.getHeight(), Bitmap.Config.ARGB_8888);
             Canvas canvas = new Canvas(returnedBitmap);
             Drawable bgDrawable = mContent.getBackground();
             if (bgDrawable != null)
                 bgDrawable.draw(canvas);
             else
                 canvas.drawColor(Color.WHITE);
             mContent.draw(canvas);
    
             ByteArrayOutputStream bs = new ByteArrayOutputStream();
             returnedBitmap.compress(Bitmap.CompressFormat.PNG, 50, bs);
             byte[] byteArray = bs.toByteArray();
             Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray , 0, byteArray.length);
    
    
    
             //send the captured signature to Check and Operations page
             Intent returncapSigIntent = new Intent();
             returncapSigIntent.putExtra("signature",bitmap);
            setResult(RESULT_OK, returncapSigIntent);
            finish();
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
          if (requestCode == GET_NOTES)        // For textview (working fine)
          {
            if(resultCode == RESULT_OK)
            {
                if (data.hasExtra("notes ready")) 
            {
                String readyNotes = data.getExtras().getString("notes ready");
                showNotesFromNotesClass.setText(readyNotes);
            }
          }
    
          if (requestCode == GET_SIG)         // for Button - this isn't being  
                                                          called instead 
          {
              if(resultCode == RESULT_OK)
              {
                if (data.hasExtra("signature")) 
    
                    //display Bitmap in an ImageView
    
                    capturedSigImageFromCapSigclass = (Bitmap) data.getExtras().get("signature");
                    imgSig.setImageBitmap(capturedSigImageFromCapSigclass);
                }
              }
    
        }
          }
    }
    
    如何将ByteArray更改为位图并将位图发送到活动B:

    int capSig = arg0.getId();
    if(capSig == R.id.capSig)      //Button  which takes me to sub-activity of B
    {
        Intent goToCapSignatures = new Intent(this, CaptureSignature.class);
        startActivityForResult(goToCapSignatures, GET_SIG);
    
    }
    
    Bitmap returnedBitmap = Bitmap.createBitmap(mContent.getWidth(),
                     mContent.getHeight(), Bitmap.Config.ARGB_8888);
             Canvas canvas = new Canvas(returnedBitmap);
             Drawable bgDrawable = mContent.getBackground();
             if (bgDrawable != null)
                 bgDrawable.draw(canvas);
             else
                 canvas.drawColor(Color.WHITE);
             mContent.draw(canvas);
    
             ByteArrayOutputStream bs = new ByteArrayOutputStream();
             returnedBitmap.compress(Bitmap.CompressFormat.PNG, 50, bs);
             byte[] byteArray = bs.toByteArray();
             Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray , 0, byteArray.length);
    
    
    
             //send the captured signature to Check and Operations page
             Intent returncapSigIntent = new Intent();
             returncapSigIntent.putExtra("signature",bitmap);
            setResult(RESULT_OK, returncapSigIntent);
            finish();
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
          if (requestCode == GET_NOTES)        // For textview (working fine)
          {
            if(resultCode == RESULT_OK)
            {
                if (data.hasExtra("notes ready")) 
            {
                String readyNotes = data.getExtras().getString("notes ready");
                showNotesFromNotesClass.setText(readyNotes);
            }
          }
    
          if (requestCode == GET_SIG)         // for Button - this isn't being  
                                                          called instead 
          {
              if(resultCode == RESULT_OK)
              {
                if (data.hasExtra("signature")) 
    
                    //display Bitmap in an ImageView
    
                    capturedSigImageFromCapSigclass = (Bitmap) data.getExtras().get("signature");
                    imgSig.setImageBitmap(capturedSigImageFromCapSigclass);
                }
              }
    
        }
          }
    }
    
    活动B中的onActivityResult():

    int capSig = arg0.getId();
    if(capSig == R.id.capSig)      //Button  which takes me to sub-activity of B
    {
        Intent goToCapSignatures = new Intent(this, CaptureSignature.class);
        startActivityForResult(goToCapSignatures, GET_SIG);
    
    }
    
    Bitmap returnedBitmap = Bitmap.createBitmap(mContent.getWidth(),
                     mContent.getHeight(), Bitmap.Config.ARGB_8888);
             Canvas canvas = new Canvas(returnedBitmap);
             Drawable bgDrawable = mContent.getBackground();
             if (bgDrawable != null)
                 bgDrawable.draw(canvas);
             else
                 canvas.drawColor(Color.WHITE);
             mContent.draw(canvas);
    
             ByteArrayOutputStream bs = new ByteArrayOutputStream();
             returnedBitmap.compress(Bitmap.CompressFormat.PNG, 50, bs);
             byte[] byteArray = bs.toByteArray();
             Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray , 0, byteArray.length);
    
    
    
             //send the captured signature to Check and Operations page
             Intent returncapSigIntent = new Intent();
             returncapSigIntent.putExtra("signature",bitmap);
            setResult(RESULT_OK, returncapSigIntent);
            finish();
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
          if (requestCode == GET_NOTES)        // For textview (working fine)
          {
            if(resultCode == RESULT_OK)
            {
                if (data.hasExtra("notes ready")) 
            {
                String readyNotes = data.getExtras().getString("notes ready");
                showNotesFromNotesClass.setText(readyNotes);
            }
          }
    
          if (requestCode == GET_SIG)         // for Button - this isn't being  
                                                          called instead 
          {
              if(resultCode == RESULT_OK)
              {
                if (data.hasExtra("signature")) 
    
                    //display Bitmap in an ImageView
    
                    capturedSigImageFromCapSigclass = (Bitmap) data.getExtras().get("signature");
                    imgSig.setImageBitmap(capturedSigImageFromCapSigclass);
                }
              }
    
        }
          }
    }
    
    onActivityResult()
    在活动A中:(改为调用此函数)

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
    
          if (resultCode == RESULT_OK && requestCode == REQUEST_APPLIANCE) {
            if (data.hasExtra("selected appliance")) 
            {
                String selectedAppType = data.getExtras().getString("selected appliance");
                tvApplianceType.setText(selectedAppType);
              Toast.makeText(this, data.getExtras().getString("selected appliance"),
                Toast.LENGTH_SHORT).show();
            }
          }
        }
    

    我确信我正在做一些工作。请给我一些指示或指导我哪里出了问题。这将非常感谢,因为我已经在这个逻辑上花了几天时间,没有取得任何进展。谢谢你可以简单地更改每个活动的requestCode值,以确保只调用一个

    requestsCode只是int常量,它们只是代表

    private static final int GET_NOTES = 0;
    
    ...
    
    private static final int GET_SIG = 1;
    ...
    
    private static final int REQUEST_APPLIANCE = 2;
    

    这应该足以使结果多样化

    谢谢你的回复mate。你的意思是在我的代码
    onActivityResult()中更改
    requestCode
    ,比如'if(resultCode==RESULT\u OK&&requestCode==2)`?不,您必须在声明变量GET_NOTES、GET_SIG和REQUEST_APPLIANCE的地方更改它,只需确保它们代表它们之间的不同数字(它们在活动调用方和获取结果的活动中必须相同)我已经按照你的建议做了,但是仍然不起作用。请记住,REQUEST_APPLIANCE在一个类中,GET_NOTES和GET SIG都在另一个类中。这不起作用是因为我在两个不同的类中使用了它们吗?如果你从类a调用活动B,它将始终向类a返回代码,如果你从C调用D,则返回相同的代码。你能让它工作的唯一方法是使用一个集中的活动,它可以启动更多的活动并控制返回的代码库,我不能理解你。请你详细说明一下。