莫问天涯路几重,轻衫侧帽且从容。这篇文章主要讲述如何从firebase加载WhatsApp Sticker?相关的知识,希望能为你提供帮助。
问题描述如何从firebase加载贴纸包?
链接我已经经历过 -https://github.com/idoideas/StickerMaker-for-Whatsapp https://github.com/viztushar/stickers-internet
答案好吧,在从firebase加载贴纸之前,你必须使用贴纸属性,提供者和更多东西制作一个类(你可以很容易地知道如何从firebase中检索数据,对于任何数据都是一样的,所以我要跳过那一步)..
动态WAStickers应用程序应具有以下特征:
- Content Provider提供必要的详细信息
- 它应该发送一个意图Whatsapp共享有关贴纸包的所有详细信息
- 图像必须是(或转换为)webp格式
内容提供程序是位于应用程序及其数据源之间的类,其作用是提供对底层数据源的轻松访问。您的设备上的其他应用程序也可以访问此数据。
要向WhatsApp提供有关StickerPack的必要信息,您需要创建一个名为StickerPack的类,它将包含以下参数。
class StickerPack implements Parcelable {
String identifier;
String name;
String publisher;
String trayImageFile;
final String publisherEmail;
final String publisherWebsite;
final String privacyPolicyWebsite;
final String licenseAgreementWebsite;
String iosAppStoreLink;
private List<
Sticker>
stickers;
private long totalSize;
String androidPlayStoreLink;
private boolean isWhitelisted;
StickerPack(String identifier, String name, String publisher, String trayImageFile, String publisherEmail, String publisherWebsite, String privacyPolicyWebsite, String licenseAgreementWebsite) {
this.identifier = identifier;
this.name = name;
this.publisher = publisher;
this.trayImageFile = trayImageFile;
this.publisherEmail = publisherEmail;
this.publisherWebsite = publisherWebsite;
this.privacyPolicyWebsite = privacyPolicyWebsite;
this.licenseAgreementWebsite = licenseAgreementWebsite;
}
}
有关此课程的更多信息,请访问Link。
此类还包含贴图的ArrayList,其中Sticker由以下类定义。
package com.example.samplestickerapp;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
class Sticker implements Parcelable {
String imageFileName;
List<
String>
emojis;
long size;
Sticker(String imageFileName, List<
String>
emojis) {
this.imageFileName = imageFileName;
this.emojis = emojis;
}protected Sticker(Parcel in) {
imageFileName = in.readString();
emojis = in.createStringArrayList();
size = in.readLong();
}public static final Creator<
Sticker>
CREATOR = new Creator<
Sticker>
() {
@Override
public Sticker createFromParcel(Parcel in) {
return new Sticker(in);
}@Override
public Sticker[] newArray(int size) {
return new Sticker[size];
}
};
public void setSize(long size) {
this.size = size;
}@Override
public int describeContents() {
return 0;
}@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(imageFileName);
dest.writeStringList(emojis);
dest.writeLong(size);
}
}
创建内容提供程序要创建内容提供程序,第一步是:
获得使用ContentProvider的权限:在Android Manifest中,我们应该要求读/写权限才能使用内容提供程序。这是一个安全功能,可以通知用户应用程序实际执行的操作。
<
provider
android:name=".StickerContentProvider"
android:authorities="${contentProviderAuthority}"
android:enabled="true"
android:exported="true"
android:readPermission="com.whatsapp.sticker.READ" />
${contentProviderAuthority}
将被内容提供商的授权名称替换。创建一个扩展ContentProvider URI的类 - 统一资源标识符:URI用于专门识别或提供手机上某些数据的位置。
这个位置就是您确切知道我们要查询的数据类型的方式。位置由3部分构成:
- (1)content://- 内容提供者前缀
- (2)内容权限 - 指定要使用的Content Provider
- (3)特定数据 - 一个字符串,用于准确识别我们在访问时感兴趣的内容提供商中的哪些数据。
首先,在ContentProvider类的onCreate方法中,创建一个URI Matcher对象并将URI添加到对象中。在阅读下面的代码片段之前,请阅读here中关于Uri Matcher的内容。
既然您熟悉URI匹配器,那么您必须熟悉如何使用它
- 首先,我们构建一个Uri Matcher对象的树。
- 然后我们将Url传递给getType函数,该函数将它与我们的URI匹配让我们在这里执行第一步。
private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
static final String METADATA =https://www.songbingjia.com/android/“metadata”;
private static final int METADATA_CODE = 1;
private static final int METADATA_CODE_FOR_SINGLE_PACK = 2;
private static final int STICKERS_CODE = 3;
static final String STICKERS_ASSET =“stickers_asset”;
private static final int STICKERS_ASSET_CODE = 4;
private static final int STICKER_PACK_TRAY_ICON_CODE = 5;
@Override public boolean onCreate() { final String authority = BuildConfig.CONTENT_PROVIDER_AUTHORITY; if (!authority.startsWith(Objects.requireNonNull(getContext()).getPackageName())) { throw new IllegalStateException("your authority (" + authority + ") for the content provider should start with your package name: " + getContext().getPackageName()); } MATCHER.addURI(authority, METADATA, METADATA_CODE); MATCHER.addURI(authority, METADATA + "/*", METADATA_CODE_FOR_SINGLE_PACK); MATCHER.addURI(authority, STICKERS + "/*", STICKERS_CODE); for (StickerPack stickerPack : getStickerPackList()) { MATCHER.addURI(authority, STICKERS_ASSET + "/" + stickerPack.identifier + "/" + stickerPack.trayImageFile, STICKER_PACK_TRAY_ICON_CODE); for (Sticker sticker : stickerPack.getStickers()) { MATCHER.addURI(authority, STICKERS_ASSET + "/" + stickerPack.identifier + "/" + sticker.imageFileName, STICKERS_ASSET_CODE); } }return true; }
@Override
public String getType(@NonNull Uri uri) {
final int matchCode = MATCHER.match(uri);
switch (matchCode) {
case METADATA_CODE:
return "vnd.android.cursor.dir/vnd." + BuildConfig.CONTENT_PROVIDER_AUTHORITY + "." + METADATA;
case METADATA_CODE_FOR_SINGLE_PACK:
return "vnd.android.cursor.item/vnd." + BuildConfig.CONTENT_PROVIDER_AUTHORITY + "." + METADATA;
case STICKERS_CODE:
return "vnd.android.cursor.dir/vnd." + BuildConfig.CONTENT_PROVIDER_AUTHORITY + "." + STICKERS;
case STICKERS_ASSET_CODE:
return "image/webp";
case STICKER_PACK_TRAY_ICON_CODE:
return "image/png";
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
}
接下来,根据Url,我们调用与Uri匹配的查询方法,并返回特定Uri的游标对象。
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
final int code = MATCHER.match(uri);
if (code == METADATA_CODE) {
return getPackForAllStickerPacks(uri);
} else if (code == METADATA_CODE_FOR_SINGLE_PACK) {
return getCursorForSingleStickerPack(uri);
} else if (code == STICKERS_CODE) {
return getStickersForAStickerPack(uri);
} else {
throw new IllegalArgumentException("Unknown URI: " + uri);
}
}
游标是提供对Content Provider数据的读/写访问的迭代器。
请参阅here中的getPackForAllStickerPacks(),getCursorForSingleStickerPack()和getStickerPackInfo()函数。要知道Cursor对象提供的数据类型。
恭喜!到现在为止,您已达到了第一个里程碑。到目前为止我们已经了解到
- 什么是内容提供商?
- 我们通过ContentProviders发送什么类型的数据?
- 我们如何处理Uri以给出特定的Cursor对象?
之后,您只需要加载firebase中的内容,它应该在您的类中具有相同的结构。
【如何从firebase加载WhatsApp Sticker()】资料来源:Link
推荐阅读
- 如何通过自动装配注入具有不同配置的不同ObjectMappers()
- Heads Up通知和徽章在某些Android设备中没有显示()
- Spring Boot获得application.properties的距离(或其文件路径)
- 8个要在你的WordPress开发中添加的最佳插件
- 2020年开发移动应用程序时要考虑的因素
- 推荐(2020年iOS应用开发趋势)
- 使用shutil.copy复制具有文件名的文件路径列表
- Python如何在异常发生后立即停止执行函数()
- 无法在使用win32COM python库创建的PIVOT表中插入计算字段