如何将图像从 firebase 加载到导航 material 抽屉图标
How to load image from firebase to the navigation material drawer icon
我无法将图像从 firebase 添加到导航抽屉
由于从 firebase 获取 url 的异步方法,我在创建导航抽屉后获取图像的 url 在导航抽屉之后调用获取 url 的方法已创建,无法更新。
由于从 firebase 获取 url 的异步方法,我在创建导航抽屉后获取图像的 url 获取 url 的方法是在创建导航抽屉后调用,因此无法更新它。我试图创建一个 class 和执行此操作的方法,但是在 onCreate 方法执行后调用它们,这就是我试图获取图像的地方 url
if (profileImageUrlRef != null)
{
profileImageUrlRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri)
{
urlImage=uri.toString();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
}
DrawerImageLoader.init(new AbstractDrawerImageLoader() {
@Override
public void set(ImageView imageView, Uri uri, Drawable placeholder, String tag) {
Glide.with(imageView.getContext()).load(uri).placeholder(placeholder).into(imageView);
}
@Override
public void cancel(ImageView imageView) {
Glide.with(Client_Services.this).clear(imageView);
}
@Override
public Drawable placeholder(Context ctx, String tag) {
//define different placeholders for different imageView targets
//default tags are accessible via the DrawerImageLoader.Tags
//custom ones can be checked via string. see the CustomUrlBasePrimaryDrawerItem LINE 111
if (DrawerImageLoader.Tags.PROFILE.name().equals(tag)) {
return DrawerUIUtils.getPlaceHolder(ctx);
} else if (DrawerImageLoader.Tags.ACCOUNT_HEADER.name().equals(tag)) {
return new IconicsDrawable(ctx).iconText(" ").backgroundColorRes(com.mikepenz.materialdrawer.R.color.primary).sizeDp(56);
} else if ("customUrlItem".equals(tag)) {
return new IconicsDrawable(ctx).iconText(" ").backgroundColorRes(R.color.md_red_500).sizeDp(56);
}
//we use the default one for
//DrawerImageLoader.Tags.PROFILE_DRAWER_ITEM.name()
return super.placeholder(ctx, tag);
}
});
final AccountHeader headerResult = new AccountHeaderBuilder()
.withActivity(this)
.withHeaderBackground(R.drawable.background)
.addProfiles(
new ProfileDrawerItem().withName("Ceo AtRalk").withEmail("info@atralk.co.zam").withIcon(urlImage)
)
.withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
@Override
public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) {
return false;
}
})
.build();
我希望 urlImage 变量在传递给 withIcon 方法时用 url 填充
我曾经写过一个 AsyncTask
将配置文件图像缓存到 SD 卡:
/**
* AsyncTask: Profile Image
* @author Martin Zeitler
**/
public class ProfileImageTask extends AsyncTask<String, Void, Uri> {
private static final String LOG_TAG = ProfileImageTask.class.getSimpleName();
private static final boolean mDebug = BuildConfig.DEBUG;
private String fileName = "photo.jpg";
private boolean enforce = false;
private String sdPath;
private String url;
/** {@link IProfileImageTask} listener */
private IProfileImageTask listener;
/** Constructor */
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public ProfileImageTask(@NonNull Context context, @NonNull String url, @NonNull IProfileImageTask listener) {
this.sdPath = context.getExternalFilesDir(context.getResources().getString(R.string.app_name)) + "/";
this.listener = listener;
this.url = url;
}
@Override
protected void onPreExecute() {
/* setup destination directory */
File directory = new File(this.sdPath + Constants.FILESYSTEM_DIRECTORY_IMAGES);
if (! directory.exists()) {
//noinspection ResultOfMethodCallIgnored
directory.mkdirs();
}
/* setup file name */
String[] parts = this.url.split("/");
this.fileName = parts[parts.length - 1];
}
@Override
protected Uri doInBackground(String... arguments) {
File file = new File(this.sdPath + Constants.FILESYSTEM_DIRECTORY_IMAGES, this.fileName);
if(file.exists() && this.enforce) {
if(mDebug) {
Log.d(LOG_TAG, "delete profile image: " + file.getPath() + ", size: " + file.length() + " bytes.");
}
//noinspection ResultOfMethodCallIgnored
file.delete();
}
if (! file.exists()) {
try {
URLConnection conn = new URL(this.url).openConnection();
conn.connect();
InputStream in = conn.getInputStream();
FileOutputStream out = new FileOutputStream(file);
byte[] b = new byte[1024]; int c;
while ((c = in.read(b)) != -1) {out.write(b, 0, c);}
out.close();
in.close();
} catch (IOException e) {
if(mDebug) {Log.e(LOG_TAG, "" + e.getMessage());}
} finally {
if(mDebug) {
Log.d(LOG_TAG, "new cached profile image: " + file.getPath() + ", size: " + file.length() + " bytes.");
}
}
} else if(mDebug) {
Log.d(LOG_TAG, "existing profile image: " + file.getPath() + ", size: " + file.length() + " bytes.");
}
return Uri.fromFile(file);
}
@Override
protected void onPostExecute(Uri uri) {
if (listener != null && uri != null) {
this.listener.OnImageAvailable(uri);
}
}
}
用法示例:
if (this.currentUser != null && this.currentUser.getPhotoUrl() != null) {
new ProfileImageTask(this, this.currentUser.getPhotoUrl(), this).execute();
}
这是回调 interface
,它在任务完成时设置图像:
public interface IProfileImageTask {
/**
* indicates that the operation has finished.
* @param localUri
**/
void OnImageAvailable(@NonNull Uri localUri);
}
它的实现:
@Override
public void OnImageAvailable(@NonNull Uri uri) {
/* the Main {@link DrawerLayout} */
this.mDrawerLayout = this.findViewById(resIdLayout);
if (! this.mDrawerLayout.isInEditMode()) {
/* the {@link NavigationView} Drawer Menu */
this.mNavigationDrawer = this.findViewById(resIdDrawer);
/* the {@link NavigationView} Drawer Header */
View header = this.mNavigationDrawer.getHeaderView(0);
AppCompatImageView photoUrl = header.findViewById(R.id.photoUrl);
/* setting the photo-url */
if (this.currentUser != null && this.currentUser.getPhotoUrl() != null) {
photoUrl.setImageURI(uri);
}
}
}
我无法将图像从 firebase 添加到导航抽屉 由于从 firebase 获取 url 的异步方法,我在创建导航抽屉后获取图像的 url 在导航抽屉之后调用获取 url 的方法已创建,无法更新。
由于从 firebase 获取 url 的异步方法,我在创建导航抽屉后获取图像的 url 获取 url 的方法是在创建导航抽屉后调用,因此无法更新它。我试图创建一个 class 和执行此操作的方法,但是在 onCreate 方法执行后调用它们,这就是我试图获取图像的地方 url
if (profileImageUrlRef != null)
{
profileImageUrlRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri)
{
urlImage=uri.toString();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
}
DrawerImageLoader.init(new AbstractDrawerImageLoader() {
@Override
public void set(ImageView imageView, Uri uri, Drawable placeholder, String tag) {
Glide.with(imageView.getContext()).load(uri).placeholder(placeholder).into(imageView);
}
@Override
public void cancel(ImageView imageView) {
Glide.with(Client_Services.this).clear(imageView);
}
@Override
public Drawable placeholder(Context ctx, String tag) {
//define different placeholders for different imageView targets
//default tags are accessible via the DrawerImageLoader.Tags
//custom ones can be checked via string. see the CustomUrlBasePrimaryDrawerItem LINE 111
if (DrawerImageLoader.Tags.PROFILE.name().equals(tag)) {
return DrawerUIUtils.getPlaceHolder(ctx);
} else if (DrawerImageLoader.Tags.ACCOUNT_HEADER.name().equals(tag)) {
return new IconicsDrawable(ctx).iconText(" ").backgroundColorRes(com.mikepenz.materialdrawer.R.color.primary).sizeDp(56);
} else if ("customUrlItem".equals(tag)) {
return new IconicsDrawable(ctx).iconText(" ").backgroundColorRes(R.color.md_red_500).sizeDp(56);
}
//we use the default one for
//DrawerImageLoader.Tags.PROFILE_DRAWER_ITEM.name()
return super.placeholder(ctx, tag);
}
});
final AccountHeader headerResult = new AccountHeaderBuilder()
.withActivity(this)
.withHeaderBackground(R.drawable.background)
.addProfiles(
new ProfileDrawerItem().withName("Ceo AtRalk").withEmail("info@atralk.co.zam").withIcon(urlImage)
)
.withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
@Override
public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) {
return false;
}
})
.build();
我希望 urlImage 变量在传递给 withIcon 方法时用 url 填充
我曾经写过一个 AsyncTask
将配置文件图像缓存到 SD 卡:
/**
* AsyncTask: Profile Image
* @author Martin Zeitler
**/
public class ProfileImageTask extends AsyncTask<String, Void, Uri> {
private static final String LOG_TAG = ProfileImageTask.class.getSimpleName();
private static final boolean mDebug = BuildConfig.DEBUG;
private String fileName = "photo.jpg";
private boolean enforce = false;
private String sdPath;
private String url;
/** {@link IProfileImageTask} listener */
private IProfileImageTask listener;
/** Constructor */
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public ProfileImageTask(@NonNull Context context, @NonNull String url, @NonNull IProfileImageTask listener) {
this.sdPath = context.getExternalFilesDir(context.getResources().getString(R.string.app_name)) + "/";
this.listener = listener;
this.url = url;
}
@Override
protected void onPreExecute() {
/* setup destination directory */
File directory = new File(this.sdPath + Constants.FILESYSTEM_DIRECTORY_IMAGES);
if (! directory.exists()) {
//noinspection ResultOfMethodCallIgnored
directory.mkdirs();
}
/* setup file name */
String[] parts = this.url.split("/");
this.fileName = parts[parts.length - 1];
}
@Override
protected Uri doInBackground(String... arguments) {
File file = new File(this.sdPath + Constants.FILESYSTEM_DIRECTORY_IMAGES, this.fileName);
if(file.exists() && this.enforce) {
if(mDebug) {
Log.d(LOG_TAG, "delete profile image: " + file.getPath() + ", size: " + file.length() + " bytes.");
}
//noinspection ResultOfMethodCallIgnored
file.delete();
}
if (! file.exists()) {
try {
URLConnection conn = new URL(this.url).openConnection();
conn.connect();
InputStream in = conn.getInputStream();
FileOutputStream out = new FileOutputStream(file);
byte[] b = new byte[1024]; int c;
while ((c = in.read(b)) != -1) {out.write(b, 0, c);}
out.close();
in.close();
} catch (IOException e) {
if(mDebug) {Log.e(LOG_TAG, "" + e.getMessage());}
} finally {
if(mDebug) {
Log.d(LOG_TAG, "new cached profile image: " + file.getPath() + ", size: " + file.length() + " bytes.");
}
}
} else if(mDebug) {
Log.d(LOG_TAG, "existing profile image: " + file.getPath() + ", size: " + file.length() + " bytes.");
}
return Uri.fromFile(file);
}
@Override
protected void onPostExecute(Uri uri) {
if (listener != null && uri != null) {
this.listener.OnImageAvailable(uri);
}
}
}
用法示例:
if (this.currentUser != null && this.currentUser.getPhotoUrl() != null) {
new ProfileImageTask(this, this.currentUser.getPhotoUrl(), this).execute();
}
这是回调 interface
,它在任务完成时设置图像:
public interface IProfileImageTask {
/**
* indicates that the operation has finished.
* @param localUri
**/
void OnImageAvailable(@NonNull Uri localUri);
}
它的实现:
@Override
public void OnImageAvailable(@NonNull Uri uri) {
/* the Main {@link DrawerLayout} */
this.mDrawerLayout = this.findViewById(resIdLayout);
if (! this.mDrawerLayout.isInEditMode()) {
/* the {@link NavigationView} Drawer Menu */
this.mNavigationDrawer = this.findViewById(resIdDrawer);
/* the {@link NavigationView} Drawer Header */
View header = this.mNavigationDrawer.getHeaderView(0);
AppCompatImageView photoUrl = header.findViewById(R.id.photoUrl);
/* setting the photo-url */
if (this.currentUser != null && this.currentUser.getPhotoUrl() != null) {
photoUrl.setImageURI(uri);
}
}
}