【问题标题】:pass image path in second activity and display it在第二个活动中传递图像路径并显示它
【发布时间】:2014-09-22 15:20:02
【问题描述】:

这里是代码。 我试图将 Main_Activity 中的图像路径传递给这个新 Activity,但图像没有显示在 New_Activity 中。

所以我的问题是:如何通过传递 Main_Activity 的路径在 New_Activity 中显示图像?

有没有更简单的方法来做这样的事情?

如果可能,请详细说明。 也欢迎示例代码... 谢谢

public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity2);
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            String filename = extras.getString("map1");
            FileInputStream is = null;
            BufferedInputStream bis = null;
            try {
                is = new FileInputStream(new File(filename));
                bis = new BufferedInputStream(is);
                Bitmap bitmap = BitmapFactory.decodeStream(bis);
                myImage = (ImageView)findViewById(R.id.imageView2);
                myImage.setImageBitmap(bitmap);    
                } 
            catch (Exception e) {
                //Try to recover
            }
            finally {
                try {
                    if (bis != null) {
                        bis.close();
                    }
                    if (is != null) {
                        is.close();
                    }    
                } catch (Exception e) {
                }
            }  

            myImage.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    setResult(RESULT_OK, intent);
                    finish();
                }
            });
        }
}   

这里是 logcat 文件:

07-30 20:36:46.601: W/MapDbAdapter(387): 5
07-30 20:37:33.161: D/AndroidRuntime(387): Shutting down VM
07-30 20:37:33.161: W/dalvikvm(387): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
07-30 20:37:33.172: E/AndroidRuntime(387): FATAL EXCEPTION: main
07-30 20:37:33.172: E/AndroidRuntime(387): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.activity.map/com.example.activity.map.Activity2}: java.lang.NullPointerException
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.os.Looper.loop(Looper.java:123)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-30 20:37:33.172: E/AndroidRuntime(387):  at java.lang.reflect.Method.invokeNative(Native Method)
07-30 20:37:33.172: E/AndroidRuntime(387):  at java.lang.reflect.Method.invoke(Method.java:521)
07-30 20:37:33.172: E/AndroidRuntime(387):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-30 20:37:33.172: E/AndroidRuntime(387):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-30 20:37:33.172: E/AndroidRuntime(387):  at dalvik.system.NativeStart.main(Native Method)
07-30 20:37:33.172: E/AndroidRuntime(387): Caused by: java.lang.NullPointerException
07-30 20:37:33.172: E/AndroidRuntime(387):  at com.example.activity.map.Activity2.onCreate(Activity2.java:48)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-30 20:37:33.172: E/AndroidRuntime(387):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-30 20:37:33.172: E/AndroidRuntime(387):  ... 11 more

这是新的 logcat 文件:

07-30 21:12:25.921: W/MapDbAdapter(493): 5 07-30 21:12:28.621: D/AndroidRuntime(493): 关闭虚拟机 07-30 21:12:28.621: W/dalvikvm(493): threadid=1: 线程以未捕获的异常退出 (group=0x4001d800) 07-30 21:12:28.631:E/AndroidRuntime(493):致命异常:主要 07-30 21:12:28.631: E/AndroidRuntime(493): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.example.activity.map/com.example.activity.map.Activity2}: java.lang 。空指针异常 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.ActivityThread.access$2300(ActivityThread.java:125) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.os.Handler.dispatchMessage(Handler.java:99) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.os.Looper.loop(Looper.java:123) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.ActivityThread.main(ActivityThread.java:4627) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 java.lang.reflect.Method.invoke(Method.java:521) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 07-30 21:12:28.631: E/AndroidRuntime(493): at dalvik.system.NativeStart.main(Native Method) 07-30 21:12:28.631:E/AndroidRuntime(493):引起:java.lang.NullPointerException 07-30 21:12:28.631: E/AndroidRuntime(493): 在 com.example.activity.map.Activity2.onCreate(Activity2.java:29) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 07-30 21:12:28.631: E/AndroidRuntime(493): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 07-30 21:12:28.631: E/AndroidRuntime(493): ... 11 更多

错误出现在第 29 行:我明白了:这也是我的 java 代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity2);
    String filename = getIntent().getStringExtra("map1");
    Bitmap bitmap = BitmapFactory.decodeFile(filename);

    if (bitmap != null) {
        myImage = (ImageView)findViewById(R.id.imageView2);
        myImage.setImageBitmap(bitmap);    
        } 



            myImage.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    setResult(RESULT_OK, intent);
                    finish();
                }
            });
        }
//      private Bitmap getBitmapFromAsset(String strName){
//            AssetManager assetManager = getAssets();
//            InputStream istr = null;
//            try {
//                istr = assetManager.open(strName);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//            Bitmap bitmap = BitmapFactory.decodeStream(istr);
//            return bitmap;
//        }
}   

【问题讨论】:

  • 您遇到错误了吗?
  • 是的,它说空指针异常!但我不知道是什么问题!你知道它是如何工作的吗?或者任何其他教程来了解更多关于传递图像路径和在 newactivity 中显示图像的信息!提前致谢
  • 你的图片在 Drawable 文件夹中吗?
  • 请粘贴堆栈跟踪,这是您遇到错误时应该发布的第一件事
  • 没有我的图片在资产文件夹中:为此我必须在资产文件夹中传递图片的路径。

标签: android image android-activity path


【解决方案1】:

这是问题的答案。它完美地工作!但我传递图像而不是传递图像路径,它更容易!

public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity2);

            ImageView gallerypic = (ImageView) findViewById(R.id.imageView2);
/*Returns the value associated with the given key, or null if no mapping of the desired type exists for the given key or a null value is explicitly associated with the key.
*/
            String backgroundpath = getIntent().getExtras().getString("maps");


            if(getImageFromAssert(backgroundpath)!=null){
/*Sets a drawable as the content of this ImageView.*/
                gallerypic.setImageDrawable(getImageFromAssert(backgroundpath));
            }
        }

        private Drawable getImageFromAssert(String name){
            try {
/*read the image file from the assets */
                InputStream ims = getAssets().open(name);
/*create a drawable from the inputstream and return it */
                return Drawable.createFromStream(ims, null);
            }catch (Throwable e){
                e.printStackTrace();
            }
            return null;
        }

【讨论】:

    【解决方案2】:

    设置图像的路径,然后将图像保存到 SD 卡,然后将图像路径(作为字符串获得的图像路径)发送到下一个 Activity 并再次使用图像路径获取图像。

    将图像保存到 SD 卡并为您的位图创建图像路径

    private void saveImage() {
        File rootsd = Environment.getExternalStorageDirectory();
        File mediaStorageDir = new File(rootsd.getAbsolutePath()
                + "/YOUR_DIR/");
    
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("log_check", "failed to create directory");
                return;
            }
        }
        String fileName= "your_file_name"
    
        savedFileName = new File(mediaStorageDir.getAbsolutePath(), fileName
                + ".jpg");
    
        try {
            FileOutputStream fos = new FileOutputStream(savedFileName);
    
            yourBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            Log.e("FileNotFoundException", e + "");
        } catch (IOException e) {
            Log.e("IOException", e + "");
        }
    
    }
    

    将您的“文件名”发送到下一个活动。

    在下一个活动中,您可以使用您的文件名再次创建位图,如下面的代码。

    String imagePath = getIntent().getExtras().getString("imagePath");
    Bitmap yourBitmap = BitmapFactory.decodeFile(imagePath);
    

    【讨论】:

      【解决方案3】:
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          String filename = getIntent().getStringExtra("map1");
          Bitmap bitmap = BitmapFactory.decodeFile(filename);
      
          if (bitmap != null) {
              myImage = (ImageView)findViewById(R.id.imageView2);
              myImage.setImageBitmap(bitmap);    
              } 
      

      【讨论】:

      • 嘿,我用了你的代码,一切正常,但图像没有显示!为什么!!!
      【解决方案4】:

      这是从 Assets 文件夹中显示图像的方式

      您的操作不正确。使用此代码并让我们知道。

      您可以使用AssetManager 使用其open() 方法获取InputStream,然后使用BitmapFactorydecodeStream() 方法获取Bitmap。

      private Bitmap getBitmapFromAsset(String strName)
          {
              AssetManager assetManager = getAssets();
              InputStream istr = null;
              try {
                  istr = assetManager.open(strName);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              Bitmap bitmap = BitmapFactory.decodeStream(istr);
              return bitmap;
          }
      

      【讨论】:

      • 07-30 20:46:08.961: W/MapDbAdapter(411): 5 07-30 20:46:39.331: D/AndroidRuntime(411): 关闭 VM 07-30 20:46 :39.331: W/dalvikvm(411): threadid=1: 线程以未捕获的异常退出 (group=0x4001d800) 07-30 20:46:39.341: E/AndroidRuntime(411): 致命异常: main 07-30 20:46 :39.341:E/AndroidRuntime(411):java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.activity.map/com.example.activity.map.Activity2}:java.lang.NullPointerException 07-30 20 :46:39.341: E/AndroidRuntime(411): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
      • NPE 在哪一行?请使用这些堆栈跟踪更新您的问题,因为格式在 cmets 中丢失并且难以阅读。当您用我提出的问题更新您的问题时,请给我留言。
      • 嘿Dheeraj!我已经更新了代码!错误在第 29 行!现在我明白了!
      • @Niranjan 你的代码有什么错误,你发现了什么?
      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2013-03-04
      相关资源
      最近更新 更多