我尝试从 URL 显示图像,到目前为止我已经成功,但当我尝试从用户的 URL 加载 Instagram 个人资料图片时,它不起作用。 我想知道如何使用 Instagram API 获取用户的图像并使用 Picasso 将其加载到图像视图中。
实际上我使用的方法不需要访问令牌,您唯一需要的是用户名。我会把代码留在下面
第1步:MainActivity.java
首先获取HDProfilePicFromUrl
///This function will return to you the url of the user profile picture
private String getHDProfilePicFromUrl(String url) throws ExecutionException, InterruptedException, JSONException {
JSONObject jObject;
String parsingUsername,username;
if(url.contains("?"))
{
parsingUsername = url.substring(0,url.lastIndexOf("?"))+"/";
}
else{
parsingUsername = url;
}
username = getBetweenStrings(parsingUsername,".com/","/");
String profileInfo = new getDataFromUrl(this).execute("https://www.instagram.com/"+username+"/?__a=1").get();
jObject= new JSONObject(profileInfo);
jObject = jObject.getJSONObject("graphql");
jObject = jObject.getJSONObject("user");
String response = jObject.getString("profile_pic_url_hd");
return response; }
第二个 getBetweenStrings
private String getBetweenStrings( String text, String textFrom, String textTo) {
String result = "";
result = text.substring( text.indexOf(textFrom) + textFrom.length(), text.length());
result = result.substring(0,result.indexOf(textTo));
return result;
}
然后在您的 Activity 中创建一个名为 getDataFromUrl 的内部类,该类应如下所示:
private class getDataFromUrl extends AsyncTask<String, Void, String> {
Context mContext;
public getDataFromUrl(Context mContext) {
this.mContext = mContext;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(arg0[0]);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
return jsonStr;
} else {
Log.e(TAG, "Couldn't get json from server.");
return null;
}
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
String url = s.replace('|',',').split(",")[1];
Log.d(TAG, "Link: " + url);
}
}
现在您可以获取用户个人资料图片 URL,作为奖励,我将向您提供使用该 URL 并将图片放入 ImageView 的代码。
第2步:main_activity.xml
添加图像视图 ImageView 可以自定义,但我建议使用 1:1 比例以保持图像质量。你的 xml 应该是这样的:
<ImageView
android:id="@+id/imgProfilePic"
android:scaleType="fitXY"
android:src="@drawable/ic_image_black_24dp"
android:layout_width="300dp"
android:layout_height="300dp"/>
</RelativeLayout>
第3步:下载ImageTask.java
现在您需要创建一个名为 DownloadImageTask 的外部类,完整代码必须如下所示:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import java.io.InputStream;
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
第4步:MainActivity.java
现在最后一步是添加您的 Main Activity 加载 ImageView 的代码,该代码将位于 MainActivity.java 内的 OnCreate void 中
String url="https://www.instagram.com/juanjshb/";
ImageView = thumbnails = (ImageView)findItemById(R.id.imgProfilePic);
new DownloadImageTask(thumbnails).execute(getHDProfilePicFromUrl(url));
仅此而已,希望它能有所帮助,我已经使用此代码 2 年了,希望它能有所帮助。