【问题标题】:I get NULL when I want to grab a string in activity当我想在活动中抓取一个字符串时我得到 NULL
【发布时间】:2019-05-02 18:58:34
【问题描述】:

我试图将一个字符串从一个活动传递到另一个活动,它返回 NULL,有问题的字符串具有我之前保存的图像的 uri。

在活动一中,我有一个函数可以保存图像并将字符串 URI 放入类的变量中。接下来我放代码。

活动一

public class PaintActivity extends AppCompatActivity implements PaintView {

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

    tabLayout.setupWithViewPager(viewPager);

    intent = new Intent(this, ResultsActivity.class);

    readyButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            try {
                paintImage.buildDrawingCache();
                Bitmap bitmap = paintImage.getDrawingCache();

                saveImage(bitmap);

                presenter.getColorList();
                startActivity(intent);
            } catch(Exception e) {
                e.getMessage();
            }
        }
    });

}

private void saveImage(Bitmap finalBitmap) {

    String root = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES).toString();
    File myDir = new File(root + "/Tersuave");
    myDir.mkdirs();
    Random generator = new Random();

    int n = 10000;
    n = generator.nextInt(n);
    String fname = "Image-"+ n +".jpg";
    File file = new File (myDir, fname);
    if (file.exists ()) file.delete ();
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        // sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
        //     Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
        out.flush();
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
    // Tell the media scanner about the new file so that it is
    // immediately available to the user.
    MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                    image_path = uri.toString();
                    intent.putExtra("image_path", image_path);
                }
            });

}

}

然后在onCreate方法中

paintImage.buildDrawingCache();
Bitmap bitmap = paintImage.getDrawingCache();

// this method is the one above 
saveImage(bitmap);
presenter.getColorList();
startActivity(intent);

活动二

Intent intent = getIntent();

// return null
String image = intent.getStringExtra("image_path");

【问题讨论】:

  • 尝试在 onScanCompleted 中运行startActivity(intent);。在扫描完成之前切换活动。
  • 你能展示你的完整代码吗?很难理解这里发生的事情。但看起来您立即在活动一的onCreate() 函数中启动活动二。但是,在调用 OnScanCompletedListener 之前不会设置 image_path,这几乎总是在调用 startActivity() 之后发生。
  • 这里添加活动一的代码

标签: java android android-intent


【解决方案1】:

一旦您在扫描仪结果后保留图像文件,您就可以执行类似的操作来开始下一个活动。

     MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
        new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.i("ExternalStorage", "Scanned " + path + ":");
                Log.i("ExternalStorage", "-> uri=" + uri);
                image_path = uri.toString();

               Intent intent = new Intent(context,Activity2.class);
               intent.putExtra("image_path", image_path);
               startActivity(intent);
            }
        });

在 Activity2 中你可以做这样的事情。

    String imageFilePath = getIntent().getStringExtra("image_path");

【讨论】:

    【解决方案2】:

    查看您的实现,您之前触发了活动 ResultsActivity,并将值 image_path in 添加到 extra 到延迟的回调中。

    MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                    image_path = uri.toString();
                    intent.putExtra("image_path", image_path); // this will be called after some time
    
                }
            });
    
    
    presenter.getColorList();
    startActivity(intent);
    

    在 OnScanCompletedListener 中的 intent.putExtra 之后添加上面两行,并将其从 onClickListener 中删除

    【讨论】:

      【解决方案3】:

      在你的主要活动中,如果你想在意图中传递字符串,你应该这样做

      第一个活动

       Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
       intent.putExtra("Keyname", image_path);
       startActivity(intent);
      

      第二个活动

      onCreate....

      if(savedInstanceState == null)
                  {
                      Bundle extras = getIntent().getExtras();
                      if (extras == null)
                      {
                          //Extra bundle is null
                      }else{
                          String image = extras.getString("Keyname");
                      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-12
        • 2014-11-19
        • 2020-08-22
        • 2021-06-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        相关资源
        最近更新 更多