从Web获取Favicon,并将其保存到Pojo类中的声明的Icon中 [英] Get favicon from a web and save it to declared Icon in a Pojo class

查看:51
本文介绍了从Web获取Favicon,并将其保存到Pojo类中的声明的Icon中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个RecyclerViewAdapter,我称它为MyAdapter,并在其中设置了书签:ID,名称,图标,SearchUrl.

I have a RecyclerViewAdapter which I have called MyAdapter and there I set for a Bookmark: ID, Name, Icon, SearchUrl.

我能够显示所有这些内容,但是对于图标,它仅在Drawable中有效. 我不想将位图转换为Drawable,我只想获取保存在DB中的url的图标.
我想从位图中获取收藏夹图标,因为该图标依赖于例如它从哪个SearchUrl给出.
SearchUrl =" https://www.youtube.com " 在图标中,我需要显示youtube的收藏夹. 正如我手动说的那样,这可从drawable起作用,但这取决于用户,我不知道它是写哪种类型的Url.

I am able to show all of them but for the icon it works only from Drawable. I don't want to convert Bitmap to Drawable I only want take favicon of url which is saved in DB.
I want to take the favicon from the Bitmap because the icon depens from which SearchUrl it is gaven for example.
SearchUrl = "https://www.youtube.com" In the icon I need to show the favicon of the youtube. As I said manually this works from drawable but this is depended from the user which I do not know what kind of Url it is written.

下面您可以找到代码.

@Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        final int itemType = getItemViewType(position);
        if (itemType == ITEM_TYPE_ONE) {
            final ViewHolder viewHolder = (ViewHolder) holder;
            viewHolder.tvName.setText(arrayList.get(position).getName());

            Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(viewHolder.tvSearchUrl.setText(arrayList.get(position).getSearchUrl())).getContent()); //Here is the error of the new URL
            viewHolder.tvIcon.setImageBitmap(bitmap);
            viewHolder.tvId.setText(arrayList.get(position).getId());
            viewHolder.tvSearchUrl.setText(arrayList.get(position).getSearchUrl());
            viewHolder.tvNativeUrl.setText(arrayList.get(position).getNativeUrl());
            viewHolder.tvIcon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent;
                    String Url = viewHolder.tvSearchUrl.getText().toString();
                    String Name = viewHolder.tvName.getText().toString();
                    intent = new Intent(context, BookmarkActivity.class);
                    intent.putExtra("WebSearchUrl", Url);
                    intent.putExtra("WebSearchName", Name);
                    v.getContext().startActivity(intent);
                }
            });


            viewHolder.tvIcon.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    Intent intent = new Intent(context, ActivityChangeBookmark.class);
                    String Url = viewHolder.tvSearchUrl.getText().toString();
                    String Name = viewHolder.tvName.getText().toString();
                    Integer Id = viewHolder.tvId.getId();
                    Bundle extras = new Bundle();
                    viewHolder.tvIcon.buildDrawingCache();
                    Bitmap image = viewHolder.tvIcon.getDrawingCache();
                    intent.putExtra("Url", Url);
                    intent.putExtra("Name", Name);
                    intent.putExtra("ID", Id);
                    extras.putParcelable("Image", image);
                    intent.putExtras(extras);
                    v.getContext().startActivity(intent);
                    return false;
                }
            });

        } else if (itemType == ITEM_TYPE_TWO) {
            ButtonViewHolder buttonViewHolder = (ButtonViewHolder) holder;
            buttonViewHolder.imgButton.setImageResource(arrayList.get(position).getIcon());
        }

    }

如果我更改viewHolder.tvIcon.setImageResource(arrayList.get(position).getIcon()); 比这要来自可绘制对象,并且仅适用于可绘制对象中的图标.

If I change viewHolder.tvIcon.setImageResource(arrayList.get(position).getIcon()); than this takes from the drawable and workd only for the icons which are in drawable.

Bookmark.class

public class Bookmark {
    String name, id, nativeUrl, searchUrl;
    int icon;
    int viewType;


    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }

    public int getIcon() { return icon; }
    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getId(){
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNativeUrl() {
        return nativeUrl;
    }

    public void setNativeUrl(String nativeUrl) {
        this.nativeUrl = nativeUrl;
    }

    public String getSearchUrl() {
        return searchUrl;
    }

    public void setSearchUrl(String searchUrl) {
        this.searchUrl = searchUrl;
    }
    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
    }


    @Override
    public String toString() {
        return "Bookmark{" +
                "name='" + name + '\'' +
                ", icon='" + icon + '\'' +
                ", id='" + id + '\'' +
                ", nativeUrl='" + nativeUrl + '\'' +
                ", searchUrl='" + searchUrl + '\'' +
                '}';
    }
}

ActivityChangeBookmark.class

 public class ActivityChangeBookmark  extends AppCompatActivity {
 private ArrayList<String> listItems = new ArrayList<String>();
 private RecyclerView recyclerView;
 Button saveBookmark, cancelBookmark;
 TextView name, url;
 ImageView icon, mIcon;
 EditText mName, mUrl, mID;
 public static final String Save_Bookmark = "Save_Bookmark";
 String Url, Name;
 Integer Id;
 MyAdapter myAdapter;
 BookmarkDB bookmarkDB;
 ButtonRobotoMedium removeBookmark, sendToHomeScreen;
 ArrayList<Bookmark> arrayList = new ArrayList<>();


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_change_bookmark);
    saveBookmark = findViewById(R.id.btnSave);
    name = findViewById(R.id.tvNameEdit);
    url = findViewById(R.id.tvURLEdit);
    recyclerView = findViewById(R.id.myRecyclerView);
    icon = findViewById(R.id.ivFavIcon);
    mName = findViewById(R.id.etNameEdit);
    mUrl = findViewById(R.id.etURLEdit);
    sendToHomeScreen = findViewById(R.id.btnAddIconToDeviceScreen);
    name.setVisibility(View.GONE);
    url.setVisibility(View.GONE);
    bookmarkDB = new BookmarkDB(getApplicationContext());
    Intent intent = getIntent();
    myAdapter = new MyAdapter(getApplicationContext(), arrayList);

    Bundle extras = intent.getExtras();
    if (extras != null) {
        Url = intent.getExtras().getString("Url");
        Name = intent.getExtras().getString("Name");
        Id = intent.getExtras().getInt("ID");

        Bitmap bitmap = intent.getExtras().getParcelable("Image");
        mName.setText(Name);
        mUrl.setText(Url);

        icon.setImageBitmap(bitmap);
        removeBookmark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bookmarkDB.deleteName(Id, Name);
                myAdapter.notifyDataSetChanged();
                finish();
            }
        });
    }
     else {
        removeBookmark.setVisibility(View.GONE);
        sendToHomeScreen.setVisibility(View.GONE);
        icon.setImageResource(R.drawable.user_bookmark);
        mName.setText("");
        mUrl.setText("");
    }


    saveBookmark.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            saveData();
            myAdapter.notifyDataSetChanged();
            finish();
            }
    });

public void saveData() {
    Random r = new Random();
    int low = 14;
    int high = 100;
    int result = r.nextInt(high-low) + low;
    bookmarkDB.addBookmark(result, mName.getText().toString(), false, "https://www.google.com/s2/favicons?domain=" + mUrl.getText().toString(), mUrl.getText().toString(), "http://" + mUrl.getText().toString());
 }
}

BookmarkDB.class

 public class BookmarkDB extends SQLiteOpenHelper {
    public static final String DBNAME = "bookmarks.db"; // The name of the 
 database file
    public static final int DBVERSION = 1;  // The Database version

    public static final String TBL_BOOKMARK = "bookmark";
    public static final String COL_ID = BaseColumns._ID; // equates to _id
    public static final String COl_NAME = "name";
    public static final String COl_HIDDEN = "hidden";
    public static final String COL_ICON = "icon";
    public static final String COL_NATIVEURL = "nativeurl";
    public static final String COL_SEARCHURL = "searchurl";

    SQLiteDatabase mDB;

    public BookmarkDB(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        // The SQL to be used to create the table
        String crt_bookmark_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TBL_BOOKMARK + "(" +
                COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COl_NAME + " TEXT, " +
                COl_HIDDEN + " INTEGER, " +
                COL_ICON + " TEXT, " +
                COL_NATIVEURL + " TEXT," +
                COL_SEARCHURL + " TEXT" +
                ")";
        db.execSQL(crt_bookmark_tbl_sql); // CREATE THE TABLE

    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP IF TABLE EXISTS " + DBNAME);
        onCreate(db);
    }

    public long addBookmark(long id, String name, boolean hidden, String icon, String nativeurl, String searchurl) {
        ContentValues cv = new ContentValues();

        cv.put(COl_NAME,name);
        cv.put(COl_HIDDEN,hidden);
        cv.put(COL_ICON,icon);
        cv.put(COL_NATIVEURL,nativeurl);
        cv.put(COL_SEARCHURL,searchurl);
        // uses the convenience insert method that builds the SQL
        return mDB.insert(TBL_BOOKMARK,null,cv);
    }
    public ArrayList<Bookmark> getAllBookmarks() {
        ArrayList<Bookmark> rv  = new ArrayList<>();
        Cursor csr = mDB.query(TBL_BOOKMARK,null,null,null,null,null, null);
        while (csr.moveToNext()) {
            Bookmark b = new Bookmark();
            b.setId(csr.getString(csr.getColumnIndex(COL_ID)));
            b.setName(csr.getString(csr.getColumnIndex(COl_NAME)));
            b.setIcon(csr.getInt(csr.getColumnIndex(COL_ICON))); // Here I set the icon but I want to set icon from the saved SearchUrl.
            b.setViewType(csr.getInt(csr.getColumnIndex(COl_NAME)));
            b.setNativeUrl(csr.getString(csr.getColumnIndex(COL_NATIVEURL)));
            b.setSearchUrl(csr.getString(csr.getColumnIndex(COL_SEARCHURL)));
            rv.add(b);
        }
        return rv;
    }

FragmentBookmark.class

FragmentBookmark.class

public class FragmentBookmark extends Fragment {
    ArrayList<Bookmark> arrayList = new ArrayList<>();
    MyAdapter myAdapter;
    View paramView;
    RecyclerView myRecyclerView;
    private Context mContext;
    BookmarkDB mDB;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        mDB = new BookmarkDB(mContext);
        mDB.getAllBookmarks();
        buildBookmarkArrayListfromDB();
        loadBookMarksFromXML();
        mDB.logAllBookmarkRows();
    }
    @Nullable
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        paramView = inflater.inflate(R.layout.bookmark, container, false);
        myRecyclerView =  paramView.findViewById(R.id.myRecyclerView);
        // myRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
        myRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 4));
        myRecyclerView.setHasFixedSize(true);
        myAdapter = new MyAdapter(mContext, arrayList);
        myRecyclerView.setAdapter(myAdapter);

        myAdapter.notifyDataSetChanged();
        Bookmark bookmark = new Bookmark();
        bookmark.setViewType(1);
        bookmark.setIcon(R.drawable.add_new_bookmark_icon);
        arrayList.add(bookmark);
        return paramView;
    }
    private void loadBookMarksFromXML() {

        // MAY WISH TO ONLY DO THIS ONCE as bookmarks would be loaded OTHERWISE DELETE LINE BELOW
        if(DatabaseUtils.queryNumEntries(mDB.getWritableDatabase(),BookmarkDB.TBL_BOOKMARK) > 0 ) return;
        try {
            XmlResourceParser xpp = getResources().getXml(R.xml.bookmarks);
            while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
                if (xpp.getEventType() == XmlPullParser.START_TAG) {
                    if (xpp.getName().equals("Bookmark")) {
                        Bookmark bookmark = new Bookmark();
                        bookmark.setName(xpp.getAttributeValue(null, "name"));
                        bookmark.setSearchUrl(xpp.getAttributeValue(null, "searchUrl"));
                        bookmark.setNativeUrl(xpp.getAttributeValue(null, "nativeUrl"));
                        int drawableResourceId = getResources().getIdentifier(xpp.getAttributeValue(null, "icon"),"drawable", mContext.getPackageName());
                        bookmark.setIcon(drawableResourceId);
                        bookmark.setViewType(0);
                        if (bookmark.getId() == null) {
                            bookmark.setId("1");
                        }
                        mDB.addBookmark(
                                Long.valueOf(bookmark.getId()),
                                bookmark.getName(),
                                bookmark.getViewType() > 0,
                                String.valueOf(bookmark.getIcon()),
                                bookmark.getNativeUrl(),
                                bookmark.getSearchUrl()
                        );
                    }
                }
                xpp.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mDB.logAllBookmarkRows();
    }
    public void buildBookmarkArrayListfromDB() {
        arrayList.clear();
        arrayList.addAll(mDB.getAllBookmarks());
        Bookmark bookmark = new Bookmark();
        bookmark.setViewType(1);
        bookmark.setIcon(R.drawable.add_new_bookmark_icon);
        arrayList.add(bookmark);
    }

推荐答案

您可以使用 besticon

这是一个收藏夹服务:

This is a favicon service:

  • 支持favicon.ico和apple-touch-icon.png

    • Supports favicon.ico and apple-touch-icon.png

      简单URL API

      后退图标生成

      Docker映像&单个二进制下载,易于托管

      Docker image & single binary download for easy hosting

      示例代码如何使用

      布局

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/parentView"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_margin="10dp"
          android:orientation="vertical">
      
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal">
      
      
              <ImageView
                  android:id="@+id/stackIMG"
                  android:layout_width="32dp"
                  android:layout_height="32dp"
                  android:layout_margin="10dp" />
      
              <ImageView
                  android:id="@+id/fbIMG"
                  android:layout_width="32dp"
                  android:layout_height="32dp"
                  android:layout_margin="10dp" />
      
              <ImageView
                  android:id="@+id/twitterIMG"
                  android:layout_width="32dp"
                  android:layout_height="32dp"
                  android:layout_margin="10dp" />
      
          </LinearLayout>
      
      
      </LinearLayout>
      

      活动代码

      import android.os.Bundle;
      import android.support.v7.app.AppCompatActivity;
      import android.widget.ImageView;
      
      import com.bumptech.glide.Glide;
      import com.bumptech.glide.request.RequestOptions;
      
      public class MainActivity extends AppCompatActivity {
      
      
          String stackOverFlowURL, FacebookURL, TwitterURL;
          String BASE_URL = "https://besticon-demo.herokuapp.com/icon?url=";
      
      
          ImageView stackIMG,fbIMG,twitterIMG;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
      
              stackIMG = findViewById(R.id.stackIMG);
              fbIMG = findViewById(R.id.fbIMG);
              twitterIMG = findViewById(R.id.twitterIMG);
      
      
              stackOverFlowURL = BASE_URL + "https://stackoverflow.com/" + "&size=32;";
              FacebookURL = BASE_URL + "https://www.facebook.com/" + "&size=32;";
              TwitterURL = BASE_URL + "https://twitter.com" + "&size=32;";
      
              RequestOptions requestOptions = new RequestOptions();
              requestOptions.error(R.drawable.ic_fav);
      
              Glide.with(MainActivity.this)
                      .load(stackOverFlowURL)
                      .apply(requestOptions)
                      .into(stackIMG);
      
              Glide.with(MainActivity.this)
                      .load(FacebookURL)
                      .apply(requestOptions)
                      .into(fbIMG);
      
      
              Glide.with(MainActivity.this)
                      .load(TwitterURL)
                      .apply(requestOptions)
                      .into(twitterIMG);
          }
      
      
      }
      

      输出

      更新

      在代码中进行以下更改

      @Override
      public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
          String BASE_URL = "https://besticon-demo.herokuapp.com/icon?url=";
      
          final int itemType = getItemViewType(position);
          if (itemType == ITEM_TYPE_ONE) {
              final ViewHolder viewHolder = (ViewHolder) holder;
      
              viewHolder.tvName.setText(arrayList.get(position).getName());
      
              Glide.with(context)
                      .load(BASE_URL+arrayList.get(position).getSearchUrl()+"&size=32;")
                      .apply(requestOptions)
                      .into(viewHolder.tvIcon);
      
              viewHolder.tvId.setText(arrayList.get(position).getId());
              viewHolder.tvSearchUrl.setText(arrayList.get(position).getSearchUrl());
              viewHolder.tvNativeUrl.setText(arrayList.get(position).getNativeUrl());
              viewHolder.tvIcon.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      Intent intent;
                      String Url = viewHolder.tvSearchUrl.getText().toString();
                      String Name = viewHolder.tvName.getText().toString();
                      intent = new Intent(context, BookmarkActivity.class);
                      intent.putExtra("WebSearchUrl", Url);
                      intent.putExtra("WebSearchName", Name);
                      v.getContext().startActivity(intent);
                  }
              });
      
      
              viewHolder.tvIcon.setOnLongClickListener(new View.OnLongClickListener() {
                  @Override
                  public boolean onLongClick(View v) {
                      Intent intent = new Intent(context, ActivityChangeBookmark.class);
                      String Url = viewHolder.tvSearchUrl.getText().toString();
                      String Name = viewHolder.tvName.getText().toString();
                      Integer Id = viewHolder.tvId.getId();
                      Bundle extras = new Bundle();
                      viewHolder.tvIcon.buildDrawingCache();
                      Bitmap image = viewHolder.tvIcon.getDrawingCache();
                      intent.putExtra("Url", Url);
                      intent.putExtra("Name", Name);
                      intent.putExtra("ID", Id);
                      extras.putParcelable("Image", image);
                      intent.putExtras(extras);
                      v.getContext().startActivity(intent);
                      return false;
                  }
              });
      
          } else if (itemType == ITEM_TYPE_TWO) {
              ButtonViewHolder buttonViewHolder = (ButtonViewHolder) holder;
              buttonViewHolder.imgButton.setImageResource(arrayList.get(position).getIcon());
          }
      
      }
      

      这篇关于从Web获取Favicon,并将其保存到Pojo类中的声明的Icon中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆