File size: 6,053 Bytes
8f9a9c4
1ebae77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f9a9c4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>QR Scan Difficulty</title>
  <meta name="description" content="The same QR code scans on some phones and fails on others. Measured on the scanners in iPhones and Android phones: how many codes each misses, and why.">
  <link rel="stylesheet" href="style.css">
</head>
<body>
<main class="page">

  <header class="hero">
    <p class="kicker">QR scan difficulty · measured</p>
    <h1>Not every phone reads the same QR codes.</h1>
    <div class="versus" id="versus" aria-live="polite"></div>
  </header>

  <section class="block" aria-labelledby="introTitle">
    <h2 id="introTitle">The QR code was invented for messy factories</h2>
    <p class="section-lede">In 1994, <a href="https://www.denso.com/global/en/business/innovation/qrcode/" target="_blank" rel="noopener">Denso</a>, a Toyota-group parts maker, made the QR code for its factory floors. A barcode held about 20 characters, so workers scanned about ten for each product. “It was more like a job to read the barcode than to make the product,” <a href="https://www.denso.com/global/en/driven-base/career-life/qr-hara_2408/" target="_blank" rel="noopener">recalls Masahiro Hara</a>, who led the work. And “if the barcodes were contaminated with oil, they would become unreadable.”</p>
    <p class="section-lede">So the new code had to “hold up against oil and grime.” It repairs itself: its <a href="https://www.qrcode.com/en/about/error_correction.html" target="_blank" rel="noopener">error correction</a>, the kind used on music CDs, restores the content even when <a href="https://ethw.org/Milestones:QR_(Quick_Response)_Code,_1994" target="_blank" rel="noopener">up to 30% of the code</a> is dirty or damaged. Hara credits the factory on site: “If I had been involved in code development at an IT company, I would not have successfully created the QR Code.”</p>
    <p class="section-lede" id="introNote"></p>
    <p class="takeaway" id="introClose"></p>
  </section>

  <section class="block" aria-labelledby="whoTitle">
    <h2 id="whoTitle">More than a billion phones read fewer codes than an iPhone</h2>
    <p class="section-lede">On every iPhone, the Camera reads codes with Apple’s scanner. On Android, the Camera and <a href="https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java" target="_blank" rel="noopener">QR button</a> mostly open the maker’s own scanner, such as <a href="https://www.samsung.com/us/support/answer/ANS10001925/" target="_blank" rel="noopener">Samsung’s</a> or Huawei’s <a href="https://developer.huawei.com/consumer/en/hms/huawei-scankit/" target="_blank" rel="noopener">Scan Kit</a>; on Pixel, the QR button opens Google’s <a href="https://developers.google.com/ml-kit" target="_blank" rel="noopener">ML Kit</a>. Google’s scanner also comes with Google Play services, so apps on most Android phones can use it; WhatsApp and Instagram carry it.</p>
    <div class="grid-wrap"><table class="phones who" id="who"></table></div>
    <p class="fine" id="whoHow"></p>
    <p class="takeaway" id="whoNote"></p>
    <p class="fine" id="whoSource"></p>
  </section>

  <section class="block" aria-labelledby="androidTitle">
    <h2 id="androidTitle">The gap opens on harder codes</h2>
    <p class="section-lede">Each row is one set of codes, and each mark one scanner. The band, and the number at the right, span the Android scanners.</p>
    <div class="res" id="gridRes"></div>
    <div class="skey" id="skey"></div>
    <div class="strips" id="strips" role="list" aria-label="Share of codes each scanner read, by set"></div>
    <p class="takeaway" id="stripNote"></p>
    <p class="fine" id="gridNote"></p>
    <div class="grid-wrap" id="numbers" hidden><table class="phones" id="phones"></table></div>
  </section>

  <section class="block" aria-labelledby="spectrumTitle">
    <h2 id="spectrumTitle">Even everyday prints fail on some scanners</h2>
    <p class="section-lede" id="lede"></p>
    <div class="spectrum">
      <figure class="bell-figure">
        <div class="key bell-key" id="bellKey"></div>
        <svg class="chart" id="bell" role="img" aria-labelledby="spectrumTitle"></svg>
        <input type="range" id="cursor" class="range" min="-6" max="106" step="0.5" value="40" aria-label="Move along the difficulty scale">
        <p class="readout" id="readout" aria-live="polite"></p>
        <figcaption class="fine" id="bellNote"></figcaption>
      </figure>
      <aside class="specimen" id="specimen" aria-live="polite"></aside>
    </div>
    <p class="takeaway" id="takeaway"></p>
    <details class="more" id="lanesMore">
      <summary>See each scanner</summary>
      <div class="more-body">
        <div class="res" id="laneRes"></div>
        <div class="key lanes-key" id="lanesKey"></div>
        <svg class="chart" id="lanes" role="img" aria-label="Share of codes each scanner read, by difficulty"></svg>
        <p class="fine" id="lanesNote"></p>
      </div>
    </details>
  </section>

  <section class="block" aria-labelledby="factorsTitle">
    <h2 id="factorsTitle">What makes a code hard to read</h2>
    <p class="section-lede" id="factorsLede"></p>
    <div class="pairs" id="pairs"></div>
    <details class="more" id="factorsMore">
      <summary>Explore every factor</summary>
      <div class="more-body" id="explorer"></div>
    </details>
  </section>

  <section class="block" aria-labelledby="adviceTitle">
    <h2 id="adviceTitle">What helps a code scan on every phone</h2>
    <ol class="advice" id="advice"></ol>
  </section>

  <footer class="block footer">
    <details class="more" id="method">
      <summary>How we measured</summary>
      <div class="more-body" id="methodBody"></div>
    </details>
  </footer>

  <div class="tooltip" id="tip" hidden></div>
</main>
<script type="module" src="app.js"></script>
</body>
</html>