【问题标题】:How to get an image from gallery (or drawable) to update an ImageView?如何从图库(或可绘制)中获取图像以更新 ImageView?
【发布时间】:2017-02-26 21:18:49
【问题描述】:

在我的代码中,我使用意图拍照,但我真的不明白在那之后我可以从哪里获得这张图片。我在这个小应用程序中的目标是拍照,然后用这张照片更新 ImageView(并以其他意图打开谷歌地图)。这两个功能通过 2 个按钮激活。

MainActivity.java:

import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {


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

    static final int REQUEST_IMAGE_CAPTURE = 1;

    public void activerCamera(View view) {
        Intent prendrePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (prendrePhoto.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(prendrePhoto, REQUEST_IMAGE_CAPTURE);
        }
    }

    public void googleMaps(View view) {
        EditText nameField = (EditText) findViewById(R.id.name_field);
        String name = nameField.getText().toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("geo:" + name));
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }
}

我的activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.android.photoapp.MainActivity">


    <EditText
        android:id="@+id/name_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Exemple : 47.6, -122.3"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="24dp"/>

    <Button
        android:layout_marginTop="24dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Aller sur google maps"
        android:layout_gravity="center_horizontal"
        android:textAllCaps="true"
        android:onClick="googleMaps"/>
    <Button
        android:layout_marginTop="24dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Prendre une photo"
        android:layout_gravity="center_horizontal"
        android:textAllCaps="true"
        android:onClick="activerCamera"/>

    <ImageView
        android:id="@+id/imageFondEcran"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

我在很多论坛和教程中看到了一些这样的方法(下),但我无法使其正常工作

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data != null) {
        Uri photoUri = data.getData();
        // Do something with the photo based on Uri
        Bitmap selectedImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), photoUri);
        // Load the selected image into a preview
        ImageView ivPreview = (ImageView) findViewById(R.id.ivPreview);
        ivPreview.setImageBitmap(selectedImage);   
    } }

【问题讨论】:

  • 为什么你的课堂上没有onActivityResult 方法?你肯定需要那个。
  • 你是怎么做到的?这和startActivityForResult 不一样?我应该在哪里设置该方法onActivityResult
  • 我只是说你打电话给startActivityForResult,那么你在哪里尝试“捕捉”这个结果?
  • 有人回答了,我不明白的一点是:为什么它有效?我们无处调用这个方法不是吗?那么为什么它会起作用呢?

标签: java android android-intent imageview


【解决方案1】:

我在很多论坛和教程中看到了一些这样的方法(下),但我无法使其正常工作

由于该代码对于大多数相机应用程序都是错误的,因此我并不感到惊讶它不适合您。

您正在发出 ACTION_IMAGE_CAPTURE 请求,但未包含 EXTRA_OUTPUT 来说明图像的位置。因此,您的照片应该是Bitmap,通过在传递给onActivityResult()Intent 上调用getParcelableExtra("data") 获得。

所以,改变:

if (data != null) {
    Uri photoUri = data.getData();
    // Do something with the photo based on Uri
    Bitmap selectedImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), photoUri);
    // Load the selected image into a preview
    ImageView ivPreview = (ImageView) findViewById(R.id.ivPreview);
    ivPreview.setImageBitmap(selectedImage);   
}

到:

if (requestCode==REQUEST_IMAGE_CAPTURE && resultCode==RESULT_OK) {
    Bitmap selectedImage = (Bitmap)data.getParcelableExtra("data");
    // Load the selected image into a preview
    ImageView ivPreview = (ImageView) findViewById(R.id.ivPreview);
    ivPreview.setImageBitmap(selectedImage);   
}

【讨论】:

  • 哇,我印象深刻。它完全有效。我真的不明白为什么 onActivityResult 有效,因为没有我们称之为它的地方。你能给我解释一下吗? (感谢您的快速回答!我从几个小时就开始工作了......)谢谢!
  • @Hix:“我真的不明白为什么 onActivityResult 工作,因为没有我们调用它的地方” - 框架调用的活动中有很多回调,而不是你。 onCreate() 就是一个例子。 onActivityResult() 是另一个。 onActivityResult() 将作为您在调用startActivityForResult() 后返回前台的活动的一部分被调用。任何体面的 Android 应用程序开发书籍或课程都涵盖了这类回调。
  • 好的,我明白了,这有点不那么混乱了。您知道任何描述此类回调的网站吗?我查阅了developper.android.com 文档,但我无法理解。
  • @Hix:我还没去找。但是,这些回调在一段时间内没有太大变化。下载one of the older editions of my book 的副本。最近的大约是 2.5 年,但它是免费的,并且涵盖了许多其他主题。
  • 我在你的个人资料上看到你在Android开发方面非常专业,所以谢谢你分享你的链接,我去看看!
【解决方案2】:

试试这个:

在您的活动中,您可以调用它来将您的可绘制资源作为可绘制对象:

Drawable d = getResources().getDrawable(R.drawable.yourimage);

如果你想在 ImageView 中显示你的drawable,你可以这样做:

ImageView i = new ImageView(this);
i.setImageResource(R.drawable.yourimage);

或在您的 xml 文件中:

<ImageView   
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/smiley"/>

祝你好运!

【讨论】:

  • 你下面的人回答了我的问题,但我也一定会尝试的!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多