【问题标题】:Picasso won't load image (Android)毕加索不会加载图像(Android)
【发布时间】:2016-03-11 09:44:12
【问题描述】:

我正在尝试使用 Picasso 将图像加载到 ImageView。最基本的东西。

我知道这很简单,我很确定我做得对,但由于某种原因它不起作用。我的应用程序中没有显示照片。我发现有人遇到了同样的问题(例如Android - Picasso in Android Studio doesn't load),我的代码与他们的固定版本几乎完全相同,但仍然无法正常工作。

这是我的代码。

在 MainActivity.java 中,我有

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

    if(savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new MyFragment())
                .commit();
    }

在 MyFragment.java 中,我有

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    ImageView image = (ImageView) rootView.findViewById(R.id.movie_image);
    Picasso.with(getActivity()).load(Uri.parse("http://i.imgur.com/DvpvklR.png")).into(image);

    return rootView;
}

fragment_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent">

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

</FrameLayout>

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.admin.popmovies">

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

    <user-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

</manifest>

build.gradle (module:app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.admin.popmovies"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
}

repositories {
    mavenCentral();
}

任何建议将不胜感激!

编辑:Logcat 我之前在 Logcat 中收到了 Picasso 的一些消息,但我再次检查,现在没有来自 Picasso 的日志。 它看起来与另一个具有相同问题的线程完全一样,看起来像这样..

02-23 16:41:36.857  28865-28865/com.example.enrico.prova D/Picasso﹕ Main        created      [R1] Request{http://www.online-image-editor.com//styles/2014/images/example_image.png}
02-23 16:41:36.858  28865-28884/com.example.enrico.prova D/Picasso﹕ Dispatcher  enqueued     [R1]+0ms
02-23 16:41:36.876  28865-29238/com.example.enrico.prova D/Picasso﹕ Hunter      executing    [R1]+16ms
02-23 16:41:36.883  28865-28884/com.example.enrico.prova D/Picasso﹕ Dispatcher  batched      [R1]+25ms for error
02-23 16:41:37.112  28865-28884/com.example.enrico.prova D/Picasso﹕ Dispatcher  delivered    [R1]+254ms
02-23 16:41:37.112  28865-28865/com.example.enrico.prova D/Picasso﹕ Main        errored      [R1]+255ms

更新:
我想到了!这是因为我的应用程序中的目标 sdk 版本是 23,而我的手机使用的是 KitKat。当我将 gradle 中的依赖项更改为 compile 'com.android.support:appcompat-v7:21.0.2' 而不是 compile 'com.android.support:appcompat-v7:23.1.1' 时,它可以工作。

再次感谢所有建议!

【问题讨论】:

标签: java android xml


【解决方案1】:

我注意到,当我使用模拟器时,我看不到图像,并通过简单的修复解决了它。

确保使用 https 而不是 http

https://image.tmdb.org/t/p/w185//2uNW4WbgBXL25BAbXGLnLqX71Sw.jpg

【讨论】:

  • 如果您添加了 proguard 规则,建议这样做。就我而言,毕加索在应用 proguard 规则后已停止加载图像。
【解决方案2】:

主要错误在您的清单文件中。

你应该更正:

&lt;user-permission android:name="android.permission.INTERNET" /&gt;

收件人:

&lt;uses-permission android:name="android.permission.INTERNET" /&gt;

所有图片都可以使用!

【讨论】:

  • 对于没有注意到错误的任何人,错误是字符 r 而不是 r 中的 s-permission android:name="android.权限.INTERNET" />
【解决方案3】:

尝试在您的清单文件的应用程序标签中使用android:usesCleartextTraffic="true"!因为我在使用 Android Volley 时遇到了同样的问题!

【讨论】:

  • 解决了我的问题!我们切换到目标 sdk 28,从那时起 picasso 将不再通过 HTTP 加载图像。
  • 毕加索没有加载我的图片,这也解决了我的问题!
【解决方案4】:

试试看

   Picasso.with(getActivity()).load("http://i.imgur.com/DvpvklR.png").into(image);

【讨论】:

  • 不幸的是,这对我不起作用...代码中是否还有其他可能的缺陷?
  • 你有没有崩溃日志?
  • 你能加载任何图像还是只有这个有问题?
【解决方案5】:

我认为你不需要解析 Uri。尝试不使用Uri.parse

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    ImageView image = (ImageView) rootView.findViewById(R.id.movie_image);
    Picasso.with(getActivity()).load("http://i.imgur.com/DvpvklR.png").into(image);

    return rootView;
}

【讨论】:

    【解决方案6】:

    这对我有用:

      Picasso.with(getActivity())
        .load("http://i.imgur.com/DvpvklR.png")
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.error)
        .resizeDimen(R.dimen.list_detail_image_size,R.dimen.list_detail_image_size)
        .centerInside()
        .into(image);
    

    【讨论】:

    • 感谢您的回复!我试过了,但我的应用程序中仍然没有显示照片。代码中是否还有其他可能的缺陷?
    • 我修改了帖子,即使它是相同的尝试!如果您收到任何崩溃日志,请告诉我,您没有什么可失去的吗?
    • 我试过了,我得到了错误照片。我在上面帖子的末尾添加了日志。你能看看吗?非常感谢!
    • 你能试试这个配置吗:compileSdkVersion 23 buildToolsVersion '23.0.1' defaultConfig { minSdkVersion 15 targetSdkVersion 23 } compile "com.android.support:appcompat-v7:23.0.1"
    • 好吧,这真的很奇怪。所以我用相同的代码创建了另一个项目,只是为了尝试什么可行,什么不可行。在新项目中,我尝试按照提到的方式更改所有 SDK 版本配置,并且成功了。然后,我尝试更改您的建议,并且效果也不错。我还尝试改回原来的版本(buildToolsVersion '23.0.2' 和 v7:23.1.1 lib 等等),这次它以某种方式工作。对于不起作用的旧项目,我尝试了适用于新项目的配置(SDKTarget21,..),但毕加索仍然无法加载..我不知道发生了什么
    【解决方案7】:

    以下代码对我有用:

    Picasso.with(this)
                    .load("http://i.imgur.com/DvpvklR.png")
                    .into(myImageView);
    

    【讨论】:

      【解决方案8】:

      我不止一次使用毕加索。 仅供参考:(pic_link 是一个 JsonElement) 希望这可以帮助你 这就是我构建方法的方式:

       public void updatePic(JsonElement jsonObject){
          Activity.this.runOnUiThread(new Runnable() {
              @Override
              public void run() {
                  final ImageView imageUser=(ImageView)findViewById(R.id.user_profile_photo);
                  final Target target = new Target() {
                      @Override
                      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                          imageUser.setImageBitmap(bitmap);
                      }
      
                      @Override
                      public void onBitmapFailed(Drawable errorDrawable) {
      
                      }
      
                      @Override
                      public void onPrepareLoad(Drawable placeHolderDrawable) {
      
                      }
                  };
                  imageUser.setTag(target);
      
                  Picasso.with(getApplicationContext())
                          .load(pic_link.getAsString())
                          .into(target);
              }
          });
      }
      

      【讨论】:

        【解决方案9】:

        使用下面的链接

        Picasso.Get().Load(imageUri).Placeholder(Resource.Drawable.patient_profile_pic).Resize(100, 100).Into(imgProflle);
        

        没有插件

        Xamarin 或 .Net

         byte[] imageBytes;
        
        
            using (var webClient = new WebClient())
            {
              imageBytes = webClient.DownloadData(imageUri);
            }
        
            Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        
            imgProflle.SetImageBitmap(bitmap);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多