Android: Apa kunci untuk mendapatkan warna latar belakang kontak?

Jadi saya telah membaca tentang bagaimana warna latar belakang yang dihasilkan secara otomatis untuk kontak dibuat. Rupanya ini didasarkan pada hashCode() dari kunci di kontak. Saya pernah melihatnya mengatakan bahwa email digunakan sebagai kunci, tetapi itu tidak masuk akal, karena tidak semua kontak saya memiliki email yang terkait dengannya, dan email yang tidak memilikinya tidak semuanya memiliki warna yang sama.

Pada akhirnya, saya ingin mendapatkan warna PERSIS yang digunakan pada kartu kontak. Dengan begitu ikon yang saya miliki di aplikasi saya memiliki warna latar belakang yang sama seperti yang akan digunakan saat Anda mengekliknya dan membuka kartu kontak menggunakan ACTION_VIEW.

Jadi, penasaran apa yang perlu saya gunakan sebagai kunci untuk menghasilkan warna yang sama yang dihasilkan oleh aplikasi kontak Android, untuk setiap kontak? Terima kasih.

PS. Berikut kode hex yang saya miliki saat ini untuk palet warna. Jika seseorang dapat memberikan kontribusi mengenai keakuratan hal ini, saya akan sangat menghargainya. Terima kasih.

<array name="letter_tile_colors">
        <item>#f16364</item>
        <item>#f58559</item>
        <item>#f9a43e</item>
        <item>#e4c62e</item>
        <item>#67bf74</item>
        <item>#59a2be</item>
        <item>#2093cd</item>
        <item>#ad62a7</item>
    </array>

Sunting: Beberapa orang mengatakan ini mirip dengan jawaban lain, Warna kontak Android lollipop

Masalah dengan jawaban itu adalah tidak lengkap. Ini menjelaskan cara menghasilkan warna dengan cara yang sama, tetapi saya tidak hanya mencoba menghasilkan warna secara acak. Saya mencari warna PERSIS yang digunakan aplikasi kontak default untuk kontak itu.


person user2223059    schedule 04.06.2016    source sumber
comment
Kemungkinan duplikat warna kontak Android lollipop   -  person GreyBeardedGeek    schedule 04.06.2016
comment
Ini bukan. Pertanyaan itu memberikan rumus yang saya gunakan untuk memilih kode hex dari daftar, tetapi tidak menentukan cara mendapatkan warna PERSIS yang digunakan oleh aplikasi kontak.   -  person user2223059    schedule 05.06.2016
comment
Masalahnya adalah mendapatkan daftar warna yang tepat, jika metode yang disebutkan di atas digunakan, ATAU mencari metode alternatif yang sama. Ada ide?   -  person Deepak Negi    schedule 05.07.2016
comment
@DeepakNegi periksa jawaban saya.   -  person Gustavo Morales    schedule 12.07.2016


Jawaban (2)


Dari kode sumber ContactsCommon Google:

Pengidentifikasi adalah string unik dan deterministik yang dapat digunakan untuk mengidentifikasi kontak ini. Ini biasanya merupakan kunci pencarian kontak, namun rincian kontak lainnya juga dapat digunakan, terutama untuk kontak non-lokal atau sementara yang mungkin tidak memiliki kunci pencarian. Ini digunakan untuk menentukan warna ubin. Dari ContactPhotoManager.

Pengidentifikasi digunakan kelas LetterTileDrawable untuk memilih warna ubin (pengidentifikasi berasal dari permintaan kontak).

/**
 * Returns a deterministic color based on the provided contact identifier string.
 */
private int pickColor(final String identifier) {
    if (TextUtils.isEmpty(identifier) || mContactType == TYPE_VOICEMAIL) {
        return sDefaultColor;
    }
    // String.hashCode() implementation is not supposed to change across java versions, so
    // this should guarantee the same email address always maps to the same color.
    // The email should already have been normalized by the ContactRequest.
    final int color = Math.abs(identifier.hashCode()) % sColors.length();
    return sColors.getColor(color, sDefaultColor);
}

Palet ditentukan di colors.xml berkas:

<!-- Background colors for LetterTileDrawables. This set of colors is a subset of
    https://spec.googleplex.com/quantumpalette#extended which passes Google Accessibility
    Requirements for the color in question on white with >= 3.0 contrast. We used
    http://leaverou.github.io/contrast-ratio/#white-on-%23db4437 to double-check the contrast.
    These colors are also used by MaterialColorMapUtils to generate primary activity colors.
-->
<array name="letter_tile_colors">
    <item>#DB4437</item>
    <item>#E91E63</item>
    <item>#9C27B0</item>
    <item>#673AB7</item>
    <item>#3F51B5</item>
    <item>#4285F4</item>
    <item>#039BE5</item>
    <item>#0097A7</item>
    <item>#009688</item>
    <item>#0F9D58</item>
    <item>#689F38</item>
    <item>#EF6C00</item>
    <item>#FF5722</item>
    <item>#757575</item>
</array>
<!-- Darker versions of letter_tile_colors, two shades darker. These colors are used
    for settings secondary activity colors. -->
<array name="letter_tile_colors_dark">
    <item>#C53929</item>
    <item>#C2185B</item>
    <item>#7B1FA2</item>
    <item>#512DA8</item>
    <item>#303F9F</item>
    <item>#3367D6</item>
    <item>#0277BD</item>
    <item>#006064</item>
    <item>#00796B</item>
    <item>#0B8043</item>
    <item>#33691E</item>
    <item>#E65100</item>
    <item>#E64A19</item>
    <item>#424242</item>
</array>
<!-- The default color used for tinting photos when no color can be extracted via Palette,
        this is Blue Grey 500 -->
<color name="quickcontact_default_photo_tint_color">#607D8B</color>
<!-- The default secondary color when no color can be extracted via Palette,
        this is Blue Grey 700 -->
<color name="quickcontact_default_photo_tint_color_dark">#455A64</color>
<color name="letter_tile_default_color">#cccccc</color>
<color name="letter_tile_font_color">#ffffff</color>
person Gustavo Morales    schedule 11.07.2016

Semoga ini bisa membantu Anda

 private static final int NUM_OF_TILE_COLORS = 8;
 private final TypedArray mColors;

    //initialize inside oncreate of your activity
    mColors = res.obtainTypedArray(R.array.letter_tile_colors);//array of colors you have

    //call in wherver you want, key is the name of the contact
    private int pickColor(String key) {
    // String.hashCode() is not supposed to change across java versions, so
    // this should guarantee the same key always maps to the same color
    final int color = Math.abs(key.hashCode()) % NUM_OF_TILE_COLORS;
    try {
        return mColors.getColor(color, Color.BLACK);
    } finally {
        mColors.recycle();
    }
}
person SaravInfern    schedule 10.07.2016
comment
Sayangnya tidak. Bagian itu sudah kutemukan. Nilai kunci itulah masalahnya. Kunci apa yang digunakan Google untuk nilai kontaknya? - person user2223059; 10.07.2016