Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ccfcfcb8f | ||
|
|
213689e9f9 | ||
|
|
6e2f2cab92 | ||
|
|
4b3d745154 | ||
|
|
a2bcd67568 | ||
|
|
072eec5306 | ||
|
|
d505c6b07d | ||
|
|
dbfbaab030 | ||
|
|
3d1402add4 | ||
|
|
1d2bd8d778 | ||
|
|
2bb413e3e8 | ||
|
|
75a59bc3e9 | ||
|
|
9a15bf0871 | ||
|
|
53248fd23d |
@@ -1,5 +1,13 @@
|
||||
# Change Log
|
||||
|
||||
## 1.51.0
|
||||
* Add support for Deutsche Post Matrixcode stamp
|
||||
* Allow free image rotation for scanning from images
|
||||
* Fix setting TO field in MATMSG format
|
||||
* Update Italian translation
|
||||
* Update zh-rCN translation
|
||||
* Update pt-br translation
|
||||
|
||||
## 1.50.0
|
||||
* Add support for MATMSG format
|
||||
* Add a setting to show the QR Code version
|
||||
|
||||
+3
-3
@@ -9,8 +9,8 @@ android {
|
||||
minSdkVersion 9
|
||||
targetSdkVersion sdk_version
|
||||
|
||||
versionCode 97
|
||||
versionName '1.50.0'
|
||||
versionCode 98
|
||||
versionName '1.51.0'
|
||||
|
||||
// Required for desugaring.
|
||||
multiDexEnabled true
|
||||
@@ -98,5 +98,5 @@ dependencies {
|
||||
implementation "com.android.support:preference-v14:$support_version"
|
||||
implementation 'com.google.zxing:core:3.5.0'
|
||||
implementation 'com.github.markusfisch:CameraView:1.9.1'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.3.0'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.4.0'
|
||||
}
|
||||
|
||||
@@ -19,31 +19,37 @@ object MatMsgAction : IntentAction() {
|
||||
context: Context,
|
||||
data: ByteArray
|
||||
): Intent? {
|
||||
val encoded = String(data)
|
||||
// Allow arbitrary order.
|
||||
val to = encoded.extractFirst("""[:;]TO:([\w.%@+-]+);""")
|
||||
val sub = encoded.extractFirst("""[:;]SUB:([^;]+);""")
|
||||
val body = encoded.extractFirst("""[:;]BODY:([^;]+);""")
|
||||
val mm = MatMsg(String(data))
|
||||
// Allow incomplete but not completely missing data.
|
||||
if (to == null && sub == null && body == null) {
|
||||
if (mm.isEmpty()) {
|
||||
return null
|
||||
}
|
||||
return Intent(
|
||||
Intent.ACTION_SENDTO,
|
||||
Uri.parse("mailto:")
|
||||
).apply {
|
||||
to?.let {
|
||||
putExtra(Intent.EXTRA_EMAIL, to)
|
||||
mm.to?.let {
|
||||
putExtra(Intent.EXTRA_EMAIL, arrayOf(mm.to))
|
||||
}
|
||||
sub?.let {
|
||||
putExtra(Intent.EXTRA_SUBJECT, sub)
|
||||
mm.sub?.let {
|
||||
putExtra(Intent.EXTRA_SUBJECT, mm.sub)
|
||||
}
|
||||
body?.let {
|
||||
putExtra(Intent.EXTRA_TEXT, body)
|
||||
mm.body?.let {
|
||||
putExtra(Intent.EXTRA_TEXT, mm.body)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Public so this can be tested.
|
||||
class MatMsg(encoded: String) {
|
||||
// Allow arbitrary order.
|
||||
val to = encoded.extractFirst("""[:;]TO:([\w.%@+-]+);""")
|
||||
val sub = encoded.extractFirst("""[:;]SUB:([^;]+);""")
|
||||
val body = encoded.extractFirst("""[:;]BODY:([^;]+);""")
|
||||
|
||||
fun isEmpty() = to == null && sub == null && body == null
|
||||
}
|
||||
|
||||
private fun String.extractFirst(regex: String) =
|
||||
regex.toRegex().find(this)?.groupValues?.get(1)
|
||||
|
||||
@@ -32,6 +32,7 @@ import de.markusfisch.android.binaryeye.widget.CropImageView
|
||||
import de.markusfisch.android.binaryeye.widget.DetectorView
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.binaryeye.zxing.Zxing
|
||||
import de.markusfisch.android.scalingimageview.widget.ScalingImageView
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
class PickActivity : AppCompatActivity() {
|
||||
@@ -84,6 +85,7 @@ class PickActivity : AppCompatActivity() {
|
||||
|
||||
cropImageView = findViewById(R.id.image) as CropImageView
|
||||
cropImageView.restrictTranslation = false
|
||||
cropImageView.freeRotation = true
|
||||
cropImageView.setImageBitmap(bitmap)
|
||||
cropImageView.onScan = {
|
||||
scanWithinBounds(bitmap)
|
||||
@@ -126,7 +128,9 @@ class PickActivity : AppCompatActivity() {
|
||||
val rectInImage = normalizeRoi(imageRect, rectInView)
|
||||
val cropped = bitmap.crop(
|
||||
rectInImage,
|
||||
cropImageView.imageRotation
|
||||
cropImageView.imageRotation,
|
||||
cropImageView.pivotX,
|
||||
cropImageView.pivotY
|
||||
) ?: return
|
||||
scope.launch {
|
||||
result = zxing.decodePositiveNegative(cropped)
|
||||
|
||||
@@ -5,7 +5,9 @@ import android.os.Bundle
|
||||
import android.support.design.widget.FloatingActionButton
|
||||
import android.support.v4.app.Fragment
|
||||
import android.text.Editable
|
||||
import android.text.Html
|
||||
import android.text.TextWatcher
|
||||
import android.text.method.LinkMovementMethod
|
||||
import android.view.*
|
||||
import android.widget.EditText
|
||||
import android.widget.TableLayout
|
||||
@@ -40,6 +42,7 @@ class DecodeFragment : Fragment() {
|
||||
private lateinit var metaView: TableLayout
|
||||
private lateinit var hexView: TextView
|
||||
private lateinit var format: String
|
||||
private lateinit var stampView: TextView
|
||||
private lateinit var fab: FloatingActionButton
|
||||
|
||||
private val parentJob = Job()
|
||||
@@ -84,6 +87,7 @@ class DecodeFragment : Fragment() {
|
||||
format = scan.format
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
stampView = view.findViewById(R.id.stamp)
|
||||
fab = view.findViewById(R.id.open)
|
||||
|
||||
if (!isBinary) {
|
||||
@@ -124,6 +128,17 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
val trackingLink = generateDpTrackingLink(raw, scan.format)
|
||||
if (trackingLink != null) {
|
||||
stampView.apply {
|
||||
text = Html.fromHtml(trackingLink)
|
||||
isClickable = true
|
||||
movementMethod = LinkMovementMethod.getInstance()
|
||||
}
|
||||
} else {
|
||||
stampView.visibility = View.GONE
|
||||
}
|
||||
|
||||
formatView = view.findViewById(R.id.format)
|
||||
dataView = view.findViewById(R.id.data)
|
||||
metaView = view.findViewById(R.id.meta)
|
||||
@@ -419,6 +434,73 @@ private fun hexDump(bytes: ByteArray, charsPerLine: Int = 33): String {
|
||||
return dump.toString()
|
||||
}
|
||||
|
||||
private fun generateDpTrackingLink(raw: ByteArray, format: String): String? {
|
||||
// Check for Deutsche Post Matrixcode stamp.
|
||||
var isStamp = false
|
||||
var rawData = raw
|
||||
if (format == "DATA_MATRIX" &&
|
||||
raw.toString(Charsets.ISO_8859_1).startsWith("DEA5")
|
||||
) {
|
||||
if (raw.size == 47) {
|
||||
isStamp = true
|
||||
} else if (raw.size > 47) {
|
||||
// Transform back to original data.
|
||||
rawData = raw.toString(Charsets.UTF_8).toByteArray(
|
||||
Charsets.ISO_8859_1
|
||||
)
|
||||
if (rawData.size == 47) {
|
||||
isStamp = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isStamp) {
|
||||
return null
|
||||
}
|
||||
|
||||
val hex = StringBuilder()
|
||||
hex.append(String.format("%02X", rawData[9]))
|
||||
hex.append(String.format("%02X", rawData[10]))
|
||||
hex.append(String.format("%02X", rawData[11]))
|
||||
hex.append(String.format("%02X", rawData[12]))
|
||||
hex.append(String.format("%02X", rawData[13]))
|
||||
hex.append(String.format("%X", (rawData[4].toInt() and 0x0f).toByte()))
|
||||
hex.append(String.format("%02X", rawData[5]))
|
||||
hex.append(String.format("%02X", rawData[6]))
|
||||
hex.append(String.format("%02X", rawData[7]))
|
||||
hex.append(String.format("%02X", rawData[8]))
|
||||
val hexString = hex.toString()
|
||||
val trackingNumber = hexString + String.format(
|
||||
"%X",
|
||||
crc4(hexString.toByteArray(Charsets.ISO_8859_1))
|
||||
)
|
||||
return "<a href=\"https://www.deutschepost.de/de/s/sendungsverfolgung/verfolgen.html?piececode=$trackingNumber\">Deutsche Post: $trackingNumber</a>"
|
||||
}
|
||||
|
||||
// CRC-4 with polynomial x^4 + x + 1.
|
||||
private fun crc4(input: ByteArray): Int {
|
||||
var crc = 0
|
||||
var i = 0
|
||||
while (i < input.size) {
|
||||
val c = input[i].toInt()
|
||||
var j = 0x80
|
||||
while (j != 0) {
|
||||
var bit = crc and 0x8
|
||||
crc = crc shl 1
|
||||
if (c and j != 0) {
|
||||
bit = bit xor 0x8
|
||||
}
|
||||
if (bit != 0) {
|
||||
crc = crc xor 0x3
|
||||
}
|
||||
j = j ushr 1
|
||||
}
|
||||
++i
|
||||
}
|
||||
crc = crc and 0xF
|
||||
return crc
|
||||
}
|
||||
|
||||
private fun Scan.version(): Int = Encoder.encode(
|
||||
content,
|
||||
ErrorCorrectionLevel.valueOf(errorCorrectionLevel ?: "L")
|
||||
|
||||
@@ -49,8 +49,13 @@ private fun calculateInSampleSize(
|
||||
return inSampleSize
|
||||
}
|
||||
|
||||
fun Bitmap.crop(rect: RectF, rotation: Float) = try {
|
||||
val erected = erect(rotation)
|
||||
fun Bitmap.crop(
|
||||
rect: RectF,
|
||||
rotation: Float,
|
||||
pivotX: Float,
|
||||
pivotY: Float
|
||||
) = try {
|
||||
val erected = erect(rotation, pivotX, pivotY)
|
||||
val w = erected.width
|
||||
val h = erected.height
|
||||
val x = max(0, (rect.left * w).roundToInt())
|
||||
@@ -68,7 +73,11 @@ fun Bitmap.crop(rect: RectF, rotation: Float) = try {
|
||||
null
|
||||
}
|
||||
|
||||
private fun Bitmap.erect(rotation: Float): Bitmap = if (
|
||||
private fun Bitmap.erect(
|
||||
rotation: Float,
|
||||
pivotX: Float,
|
||||
pivotY: Float
|
||||
): Bitmap = if (
|
||||
rotation % 360f != 0f
|
||||
) {
|
||||
Bitmap.createBitmap(
|
||||
@@ -78,7 +87,7 @@ private fun Bitmap.erect(rotation: Float): Bitmap = if (
|
||||
width,
|
||||
height,
|
||||
Matrix().apply {
|
||||
setRotate(rotation)
|
||||
setRotate(rotation, pivotX, pivotY)
|
||||
},
|
||||
true
|
||||
)
|
||||
|
||||
@@ -100,14 +100,15 @@ class DetectorView : View {
|
||||
}
|
||||
|
||||
private fun setCropHandlePos(x: Int, y: Int, orientation: Int) {
|
||||
// Always set handlePos even if it's invalid because
|
||||
// handlePos.x may be -2 which is a signal to set the
|
||||
// default ROI.
|
||||
if (orientation == currentOrientation) {
|
||||
handlePos.set(x, y)
|
||||
} else {
|
||||
handlePos.set(y, x)
|
||||
}
|
||||
if (x > -1) {
|
||||
handleActive = true
|
||||
}
|
||||
handleActive = handlePos.x > -1
|
||||
}
|
||||
|
||||
fun update(numberOfCoordinates: Int) {
|
||||
@@ -164,8 +165,8 @@ class DetectorView : View {
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (handleGrabbed) {
|
||||
handlePos.set(x, y)
|
||||
handleActive =
|
||||
handleActive or (distSq(handlePos, touchDown) > minMoveThresholdSq)
|
||||
handleActive = handleActive ||
|
||||
distSq(handlePos, touchDown) > minMoveThresholdSq
|
||||
if (handleActive) {
|
||||
updateClipRect()
|
||||
invalidate()
|
||||
@@ -216,10 +217,10 @@ class DetectorView : View {
|
||||
val cy = clampY(y)
|
||||
val dx = abs(cx - center.x)
|
||||
val dy = abs(cy - center.y)
|
||||
// check if handle is close to the vertical or horizontal center line
|
||||
// Check if handle is close to the vertical or horizontal center line.
|
||||
if (dx < distToFull ||
|
||||
dy < distToFull ||
|
||||
// check if handle is close to a screen corner
|
||||
// Check if handle is close to a screen corner.
|
||||
((abs(cy - minY) < distToFull || abs(maxY - cy) < distToFull) &&
|
||||
abs(dx - center.x) < distToFull)
|
||||
) {
|
||||
@@ -260,23 +261,18 @@ class DetectorView : View {
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
if (handleActive) {
|
||||
drawClip(canvas)
|
||||
canvas.drawClip()
|
||||
}
|
||||
drawDots(canvas)
|
||||
canvas.drawDots()
|
||||
if (prefs.showCropHandle) {
|
||||
canvas.drawBitmap(
|
||||
handleBitmap,
|
||||
(handlePos.x - handleXRadius).toFloat(),
|
||||
(handlePos.y - handleYRadius).toFloat(),
|
||||
null
|
||||
)
|
||||
canvas.drawHandle()
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawDots(canvas: Canvas) {
|
||||
private fun Canvas.drawDots() {
|
||||
var i = 0
|
||||
while (i < coordinatesLast) {
|
||||
canvas.drawCircle(
|
||||
drawCircle(
|
||||
coordinates[i++],
|
||||
coordinates[i++],
|
||||
dotRadius,
|
||||
@@ -285,15 +281,15 @@ class DetectorView : View {
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawClip(canvas: Canvas) {
|
||||
private fun Canvas.drawClip() {
|
||||
if (minDist < 1) {
|
||||
return
|
||||
}
|
||||
// canvas.clipRect() doesn't work reliably below KITKAT.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
val radius = min(minDist / 2, cornerRadius).toFloat()
|
||||
canvas.save()
|
||||
canvas.clipOutPathCompat(
|
||||
save()
|
||||
clipOutPathCompat(
|
||||
calculateRoundedRectPath(
|
||||
roi.left.toFloat(),
|
||||
roi.top.toFloat(),
|
||||
@@ -303,13 +299,22 @@ class DetectorView : View {
|
||||
radius
|
||||
)
|
||||
)
|
||||
canvas.drawColor(shadeColor)
|
||||
canvas.restore()
|
||||
drawColor(shadeColor)
|
||||
restore()
|
||||
} else {
|
||||
canvas.drawRect(roi, roiPaint)
|
||||
drawRect(roi, roiPaint)
|
||||
}
|
||||
}
|
||||
|
||||
private fun Canvas.drawHandle() {
|
||||
drawBitmap(
|
||||
handleBitmap,
|
||||
(handlePos.x - handleXRadius).toFloat(),
|
||||
(handlePos.y - handleYRadius).toFloat(),
|
||||
null
|
||||
)
|
||||
}
|
||||
|
||||
private fun updateClipRect() {
|
||||
clampHandlePos()
|
||||
val dx = abs(handlePos.x - center.x)
|
||||
|
||||
@@ -68,6 +68,18 @@
|
||||
android:typeface="monospace"
|
||||
android:textSize="12sp"
|
||||
tools:text="54 65 73 74 20 51 52 20 Test QR\n43 6F 64 65 Code"/>
|
||||
<TextView
|
||||
android:id="@+id/stamp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/hex"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:textSize="12sp"
|
||||
android:typeface="monospace"/>
|
||||
</RelativeLayout>
|
||||
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
<item quantity="one">%2$d carattere, %1$s</item>
|
||||
<item quantity="other">%2$d caratteri, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Livello di correzione errori</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="error_correction_level">Livello di correzione degli errori</string>
|
||||
<string name="error_correction_level_l" formatted="false">Basso (Correzione del ~7%)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medio (Correzione del ~15%)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (Correzione del ~25%)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (Correzione del ~30%)</string>
|
||||
<string name="issue_number">Numero di edizione</string>
|
||||
<string name="orientation">Orientamento</string>
|
||||
<string name="other_meta_data">Metadati</string>
|
||||
@@ -22,11 +22,11 @@
|
||||
<string name="possible_country">Probabile Paese di fabbricazione</string>
|
||||
<string name="suggested_price">Prezzo consigliato</string>
|
||||
<string name="upc_ean_extension">Estensione UPC EAN</string>
|
||||
<string name="qr_version">QR version</string>
|
||||
<string name="toggle_flash">Flash</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="qr_version">Versione QR</string>
|
||||
<string name="toggle_flash">Attiva/Disattiva flash</string>
|
||||
<string name="error_flash">Errore durante l\'attivazione/disattivazione del flash</string>
|
||||
<string name="share">Condividi</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="share_as">Condividi come?</string>
|
||||
<string name="copy_to_clipboard">Copia negli appunti</string>
|
||||
<string name="copied_to_clipboard">Copiato negli appunti</string>
|
||||
<string name="copy_password">Copia password negli appunti</string>
|
||||
@@ -45,70 +45,70 @@
|
||||
<string name="info">Info</string>
|
||||
<string name="switch_camera">Cambia fotocamera</string>
|
||||
<string name="bulk_mode">Scansione continua</string>
|
||||
<string name="bulk_mode_summary">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="bulk_mode_summary">Avvia sempre la scansione in modo continuo.</string>
|
||||
<string name="bulk_mode_delay">Ritardo tra scansioni continue</string>
|
||||
<string name="restrict_format">Limita formato</string>
|
||||
<string name="remove_restriction">Rimuovi la limitazione</string>
|
||||
<string name="scan_format">Scansiona %s</string>
|
||||
<string name="quarter_second">Un quarto di secondo</string>
|
||||
<string name="half_second">Mezzo secondo</string>
|
||||
<string name="a_second">Un secondo</string>
|
||||
<string name="two_seconds">Due secondi</string>
|
||||
<string name="five_seconds">Cinque secondi</string>
|
||||
<string name="history">Cronologia</string>
|
||||
<string name="preferences">Preferenze</string>
|
||||
<string name="scan_category">Scansione</string>
|
||||
<string name="content_category">Contenuto</string>
|
||||
<string name="locale_category">Language</string>
|
||||
<string name="custom_locale">Custom language</string>
|
||||
<string name="follow_system_settings">Follow system settings</string>
|
||||
<string name="locale_category">Lingua</string>
|
||||
<string name="custom_locale">Lingua personalizzata</string>
|
||||
<string name="follow_system_settings">Segui le impostazioni di sistema</string>
|
||||
<string name="show_crop_handle">Mostra riquadro di limite</string>
|
||||
<string name="show_crop_handle_summary">Limita la scansione ad una regione personalizzata.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="barcode_formats">Formati di codici a barre</string>
|
||||
<string name="zoom_by_swiping">Zoom fotocamera scorrendo su/giù</string>
|
||||
<string name="zoom_by_swiping_summary">Scorri su o giù per controllare lo zoom della fotocamera.</string>
|
||||
<string name="auto_rotate">Riconosci i codici a barre 1D verticalmente</string>
|
||||
<string name="auto_rotate_summary">Ruota automaticamente la fotocamera per riconoscere i codici a barre 1D verticali. In base al dispositivo, potrebbe ridurre le prestazioni.</string>
|
||||
<string name="try_harder">Ottimizza il lettore per accuratezza, non velocità</string>
|
||||
<string name="try_harder">Ottimizza il lettore per accuratezza</string>
|
||||
<string name="try_harder_summary">Attiva questa opzione per codici molto difficili da leggere. Riduce le prestazioni.</string>
|
||||
<string name="show_toast_in_bulk_mode">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</string>
|
||||
<string name="show_toast_in_bulk_mode">Mostra i dati in modalità continua</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Mostra brevemente i dati scansionati durante la scansione continua.</string>
|
||||
<string name="vibrate">Vibra quando rilevato</string>
|
||||
<string name="vibrate_summary">Attivalo se vuoi che il dispositivo vibri quando viene riconosciuto un codice.</string>
|
||||
<string name="use_history">Salva cronologia delle scansioni</string>
|
||||
<string name="use_history_summary">Salva i codici riconosciuti sul dispositivo.</string>
|
||||
<string name="ignore_consecutive_duplicates">Non salvare doppi consecutivi</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Non salvare doppi consecutivi nella cronologia di scansione.</string>
|
||||
<string name="open_immediately">Salta l\'analisi e apri i contenuti direttamente</string>
|
||||
<string name="open_immediately_summary">Salta l\'analisi e apri i contenuti direttamente. Se attivo potrebbe aprire contenuti dannosi.</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignora i duplicati</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Non salvare duplicati consecutivi nella cronologia di scansione.</string>
|
||||
<string name="open_immediately">Apri subito</string>
|
||||
<string name="open_immediately_summary">Salta l\'ispezione e apri i contenuti immediatamente. Se abilitato può aprire contenuti dannosi.</string>
|
||||
<string name="copy_immediately">Copia negli appunti</string>
|
||||
<string name="copy_immediately_summary">Copia automaticamente i contenuti scansionati negli appunti. Nota che altre app potrebbero leggere gli appunti in secondo piano.</string>
|
||||
<string name="show_meta_data">Mostra metadati</string>
|
||||
<string name="show_meta_data_summary">Mostra dati aggiuntivi sul codice a barre scansionato.</string>
|
||||
<string name="show_qr_version">Show QR version</string>
|
||||
<string name="show_qr_version">Mostra versione QR</string>
|
||||
<string name="show_qr_version_summary">Show QR version number.</string>
|
||||
<string name="show_hex_dump">Mostra dump esadecimale</string>
|
||||
<string name="show_hex_dump_summary">Mostra un dump esadecimale dei contenuti scansionati.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<string name="close_automatically_summary">Automatically return to the scan screen after copying or sharing the read contents.</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="close_automatically">Vai indietro dopo la Copia/Condivisione</string>
|
||||
<string name="close_automatically_summary">Ritorna automaticamente alla schermata di scansione dopo aver copiato o condiviso i contenuti letti.</string>
|
||||
<string name="default_search_engine">Apri dati sconosciuti in</string>
|
||||
<string name="always_ask">Chiedi sempre</string>
|
||||
<string name="open_with_url">Apri dati sconosciuti con URL</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="clear_network_suggestions">Cancella suggerimenti di rete</string>
|
||||
<string name="clear_network_suggestions_summary">Rimuovi tutti i suggerimenti di rete precedentemente forniti da questa app.</string>
|
||||
<string name="really_remove_all_networks">Rimuovere davvero tutte le reti?</string>
|
||||
<string name="clear_network_suggestions_success">Suggerimenti di rete cancellati</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Niente da rimuovere</string>
|
||||
<string name="send_category">Inoltro</string>
|
||||
<string name="send_scan_active">Forward scans</string>
|
||||
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
|
||||
<string name="send_scan_url">Invia ogni scansione ad un URL</string>
|
||||
<string name="send_scan_type">Tipo di richiesta per ogni scansione</string>
|
||||
<string name="send_scan_active">Inoltra le scansioni</string>
|
||||
<string name="send_scan_active_summary">Abilita per inoltrare le scansioni a un URL specificato</string>
|
||||
<string name="send_scan_url">URL a cui inoltrare</string>
|
||||
<string name="send_scan_type">Tipo di richiesta</string>
|
||||
<string name="send_type_get_add_content">GET e aggiungi il contenuto</string>
|
||||
<string name="send_type_get_query_string">GET con stringa completa della richiesta</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Open in external browser</string>
|
||||
<string name="send_type_external_browser">Apri nel browser esterno</string>
|
||||
<string name="test_url">Test URL</string>
|
||||
<string name="really_remove_scan">Vuoi veramente rimuovere la scansione?</string>
|
||||
<string name="really_remove_all_scans">Vuoi veramente rimuovere tutte le scansioni?</string>
|
||||
@@ -123,7 +123,7 @@
|
||||
<string name="pick_list_separator">Come separare elementi della lista?</string>
|
||||
<string name="separator_line_break">Interruzione di linea</string>
|
||||
<string name="separator_ruler">Righello</string>
|
||||
<string name="save_as_file_name">Salvare come file?</string>
|
||||
<string name="save_as_file_name">Salvare come file nei Download?</string>
|
||||
<string name="file_name">Nome del file</string>
|
||||
<string name="error_saving_file">Impossibile salvare il file</string>
|
||||
<string name="error_file_exists">Il file esiste già</string>
|
||||
@@ -147,8 +147,8 @@
|
||||
<string name="export_as">Esportare come?</string>
|
||||
<string name="export_csv_comma">CSV con virgole</string>
|
||||
<string name="export_csv_semicolon">CSV con punti e virgola</string>
|
||||
<string name="export_json">Esporta come JSON</string>
|
||||
<string name="export_database">Esporta database SQLite</string>
|
||||
<string name="export_json">File JSON</string>
|
||||
<string name="export_database">Database SQLite</string>
|
||||
<string name="saved_in_downloads">Salvato nei download</string>
|
||||
<string name="rotate_image_cw">Ruota immagine in senso orario</string>
|
||||
<string name="pick_file">Scegli file immagine</string>
|
||||
@@ -157,14 +157,14 @@
|
||||
<string name="shortcut_encode">Crea un codice a barre</string>
|
||||
<string name="shortcut_preferences">Impostazioni</string>
|
||||
<string name="background_request_failed">Richiesta in secondo piano fallita</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="entry_type">Tipo</string>
|
||||
<string name="wifi_network">Rete Wi-Fi</string>
|
||||
<string name="wifi_ssid">Nome</string>
|
||||
<string name="wifi_type">Tipo di autenticazione</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_hidden">Rete nascosta</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
<string name="wifi_anonymous_identity">Identità anonima</string>
|
||||
<string name="wifi_identity">Identità</string>
|
||||
<string name="wifi_phase2">Metodo di fase 2</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Infelizmente você não poderá usar este app sem acesso à câmera.</string>
|
||||
<string name="no_camera_no_fun">Infelizmente você não poderá usar este app sem conceder o acesso à câmera.</string>
|
||||
<string name="camera_error">Não foi possível acessar a câmera, por favor tente novamente</string>
|
||||
<string name="scan_code">Escaneie código</string>
|
||||
<string name="compose_barcode">Criar código</string>
|
||||
@@ -22,11 +22,11 @@
|
||||
<string name="possible_country">Possível país de fabricação</string>
|
||||
<string name="suggested_price">Preço sugerido</string>
|
||||
<string name="upc_ean_extension">Extensão UPC EAN</string>
|
||||
<string name="qr_version">QR version</string>
|
||||
<string name="qr_version">Versão do QR</string>
|
||||
<string name="toggle_flash">Ativar lanterna</string>
|
||||
<string name="error_flash">Falha ao ligar a lanterna</string>
|
||||
<string name="share">Compartilhar</string>
|
||||
<string name="share_as">Compartilhar como?</string>
|
||||
<string name="share_as">Compartilhar em qual formato?</string>
|
||||
<string name="copy_to_clipboard">Copiar ao clipboard</string>
|
||||
<string name="copied_to_clipboard">Copiado ao clipboard</string>
|
||||
<string name="copy_password">Copiar senha ao clipboard</string>
|
||||
@@ -46,7 +46,7 @@
|
||||
<string name="switch_camera">Alterar câmera</string>
|
||||
<string name="bulk_mode">Digitalização contínua</string>
|
||||
<string name="bulk_mode_summary">Sempre executar em modo contínuo.</string>
|
||||
<string name="bulk_mode_delay">Adiar em escaneamentos contínuos</string>
|
||||
<string name="bulk_mode_delay">Adiar durante digitalização contínua</string>
|
||||
<string name="restrict_format">Limitar formato</string>
|
||||
<string name="remove_restriction">Remover limitação</string>
|
||||
<string name="scan_format">Escanear %s</string>
|
||||
@@ -62,10 +62,10 @@
|
||||
<string name="locale_category">Idioma</string>
|
||||
<string name="custom_locale">Idioma da interface</string>
|
||||
<string name="follow_system_settings">Adaptar do sistema</string>
|
||||
<string name="show_crop_handle">Mostrar limitador de corte</string>
|
||||
<string name="show_crop_handle_summary">Limitar a uma área personalizável.</string>
|
||||
<string name="show_crop_handle">Mostrar limitador customizável</string>
|
||||
<string name="show_crop_handle_summary">Permite limitar a uma área específica.</string>
|
||||
<string name="barcode_formats">Tipos de código</string>
|
||||
<string name="zoom_by_swiping">Deslize para baixo/cima para ajustar zoom</string>
|
||||
<string name="zoom_by_swiping">Deslize para ajustar zoom</string>
|
||||
<string name="zoom_by_swiping_summary">Deslize para baixo/cima na tela para ajustar zoom da câmera.</string>
|
||||
<string name="auto_rotate">Reconhecer códigos 1D verticais</string>
|
||||
<string name="auto_rotate_summary">Girar automaticamente a câmera para reconhecer códigos 1D verticais. Dependendo do dispositivo, isto pode afetar o desempenho.</string>
|
||||
@@ -74,45 +74,45 @@
|
||||
<string name="show_toast_in_bulk_mode">Mostrar dados em modo contínuo</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente os dados durante digitalização contínua.</string>
|
||||
<string name="vibrate">Vibrar ao reconhecer</string>
|
||||
<string name="vibrate_summary">Ative a opção se quiser que seu dispositivo vibre quando um código for reconhecido.</string>
|
||||
<string name="use_history">Salvar histórico de escaneamentos</string>
|
||||
<string name="vibrate_summary">Ative esta opção se quiser que seu dispositivo vibre quando um código for reconhecido.</string>
|
||||
<string name="use_history">Salvar histórico de digitalizações</string>
|
||||
<string name="use_history_summary">Salve códigos reconhecidos no seu dispositivo.</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorar duplicações</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Não salvar duplicações consecutivas no histórico de escaneamentos.</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Não salvar duplicações consecutivas no histórico de digitalizações.</string>
|
||||
<string name="open_immediately">Abrir imediatamente</string>
|
||||
<string name="open_immediately_summary">Pular a inspeção e abrir o conteúdo imediatamente. Se ativado pode abrir conteúdo perigoso.</string>
|
||||
<string name="open_immediately_summary">Pular a inspeção e abrir o conteúdo no mesmo instante. Quando ativado, pode abrir conteúdo perigoso.</string>
|
||||
<string name="copy_immediately">Copiar ao clipboard</string>
|
||||
<string name="copy_immediately_summary">Copiar automaticamente o conteúdo escaneado ao clipboard. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
|
||||
<string name="copy_immediately_summary">Copiar automaticamente ao clipboard o conteúdo digitalizado. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
|
||||
<string name="show_meta_data">Mostrar metadados</string>
|
||||
<string name="show_meta_data_summary">Mostrar dados adicionais de código escaneado.</string>
|
||||
<string name="show_qr_version">Show QR version</string>
|
||||
<string name="show_qr_version_summary">Show QR version number.</string>
|
||||
<string name="show_meta_data_summary">Mostrar dados adicionais de código digitalizado.</string>
|
||||
<string name="show_qr_version">Mostrar a versão do QR</string>
|
||||
<string name="show_qr_version_summary">Mostrar o número de versão do código QR.</string>
|
||||
<string name="show_hex_dump">Mostrar impressão hexadecimal</string>
|
||||
<string name="show_hex_dump_summary">Mostrar a impressão hexadecimal de conteúdo escaneado.</string>
|
||||
<string name="show_hex_dump_summary">Mostrar a impressão hexadecimal do conteúdo digitalizado.</string>
|
||||
<string name="close_automatically">Voltar após copiar/compartilhar</string>
|
||||
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar o código consultado.</string>
|
||||
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar o código examinado.</string>
|
||||
<string name="default_search_engine">Abrir dados desconhecidos em</string>
|
||||
<string name="always_ask">Sempre perguntar</string>
|
||||
<string name="open_with_url">Abrir dados desconhecidos via URL</string>
|
||||
<string name="clear_network_suggestions">Remover sugestões da rede</string>
|
||||
<string name="clear_network_suggestions_summary">Remover todas as sugestões da rede que foram anteriormente fornecidas pelo app.</string>
|
||||
<string name="really_remove_all_networks">Realmente remover todas as redes?</string>
|
||||
<string name="clear_network_suggestions_success">Sugestões da rede removidas</string>
|
||||
<string name="clear_network_suggestions_success">Sugestões da rede foram removidas</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nada para remover</string>
|
||||
<string name="send_category">Encaminhamento</string>
|
||||
<string name="send_scan_active">Encaminhar escaneamentos</string>
|
||||
<string name="send_scan_active_summary">Ativar para encaminhar escaneamentos à URL definida</string>
|
||||
<string name="send_scan_active">Encaminhar conteúdo digitalizado</string>
|
||||
<string name="send_scan_active_summary">Ative para encaminhar conteúdo digitalizado à URL definida</string>
|
||||
<string name="send_scan_url">URL à qual encaminhar</string>
|
||||
<string name="send_scan_type">Tipo de solicitação</string>
|
||||
<string name="send_type_get_add_content">GET e apenas adicionar o conteúdo</string>
|
||||
<string name="send_type_get_add_content">GET e somente adicionar o conteúdo</string>
|
||||
<string name="send_type_get_query_string">GET com sequência completa da consulta</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Abrir num navegador externo</string>
|
||||
<string name="send_type_external_browser">Abrir em navegador externo</string>
|
||||
<string name="test_url">Testar a URL</string>
|
||||
<string name="really_remove_scan">Realmente quer remover este escaneamento?</string>
|
||||
<string name="really_remove_all_scans">Realmente quer remover todos os escaneamentos?</string>
|
||||
<string name="really_remove_selected_scans">Realmente remover escaneamentos selecionados?</string>
|
||||
<string name="really_remove_scan">Realmente quer remover esta digitalização?</string>
|
||||
<string name="really_remove_all_scans">Realmente quer remover todas as digitalizações?</string>
|
||||
<string name="really_remove_selected_scans">Realmente remover digitalizações selecionados?</string>
|
||||
<string name="clear_history">Limpar histórico</string>
|
||||
<string name="copy_scan">Copiar digitalização</string>
|
||||
<string name="edit_scan">Editar identificação</string>
|
||||
@@ -123,7 +123,7 @@
|
||||
<string name="pick_list_separator">Como separar itens da lista?</string>
|
||||
<string name="separator_line_break">Quebra de linha</string>
|
||||
<string name="separator_ruler">Régua</string>
|
||||
<string name="save_as_file_name">Salvar em Downloads?</string>
|
||||
<string name="save_as_file_name">Salvar para Downloads?</string>
|
||||
<string name="file_name">Nome do arquivo</string>
|
||||
<string name="error_saving_file">Não foi possível salvar o arquivo</string>
|
||||
<string name="error_file_exists">Arquivo já existe</string>
|
||||
@@ -133,10 +133,10 @@
|
||||
<string name="sms_send">Envie SMS</string>
|
||||
<string name="sms_error">Não foi possível enviar SMS</string>
|
||||
<string name="tel_dial">Disque número</string>
|
||||
<string name="tel_error">Não foi possível discar número</string>
|
||||
<string name="tel_error">Não foi possível discar o número</string>
|
||||
<string name="mail_send">Envie e-mail</string>
|
||||
<string name="mail_error">Não foi possível enviar e-mail</string>
|
||||
<string name="vcard_add">Adicionar para contatos</string>
|
||||
<string name="mail_error">Não foi possível enviar o e-mail</string>
|
||||
<string name="vcard_add">Adicionar aos contatos</string>
|
||||
<string name="vcard_failed">Não foi possível adicionar aos contatos</string>
|
||||
<string name="vevent_add">Adicionar ao calendário</string>
|
||||
<string name="vevent_failed">Não foi possível adicionar ao calendário</string>
|
||||
@@ -144,7 +144,7 @@
|
||||
<string name="search_web">Pesquisar na internet</string>
|
||||
<string name="search_scan">Pesquisar em conteúdo já digitalizado</string>
|
||||
<string name="export_to_file">Exportar para arquivo</string>
|
||||
<string name="export_as">Exportar como?</string>
|
||||
<string name="export_as">Exportar em qual formato?</string>
|
||||
<string name="export_csv_comma">Arquivo CSV com vírgulas</string>
|
||||
<string name="export_csv_semicolon">Arquivo CSV com ponto-e-vírgula</string>
|
||||
<string name="export_json">Arquivo JSON</string>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<string name="possible_country">可能产地</string>
|
||||
<string name="suggested_price">建议价格</string>
|
||||
<string name="upc_ean_extension">UPC EAN 扩展</string>
|
||||
<string name="qr_version">QR version</string>
|
||||
<string name="qr_version">QR 版本</string>
|
||||
<string name="toggle_flash">开关闪光灯</string>
|
||||
<string name="error_flash">开关闪光灯出错</string>
|
||||
<string name="share">分享</string>
|
||||
@@ -46,7 +46,7 @@
|
||||
<string name="bulk_mode">连续扫描</string>
|
||||
<string name="bulk_mode_summary">始终开启连续扫描</string>
|
||||
<string name="bulk_mode_delay">连续扫描之间的延迟</string>
|
||||
<string name="restrict_format">受限格式</string>
|
||||
<string name="restrict_format">严格模式(扫描指定编码格式)</string>
|
||||
<string name="remove_restriction">解除限制</string>
|
||||
<string name="scan_format">扫描 %s</string>
|
||||
<string name="quarter_second">四分之一秒</string>
|
||||
@@ -84,8 +84,8 @@
|
||||
<string name="copy_immediately_summary">注意其他 APP 可能会在后台监控剪贴板</string>
|
||||
<string name="show_meta_data">显示元数据</string>
|
||||
<string name="show_meta_data_summary">显示已扫描条码的额外数据</string>
|
||||
<string name="show_qr_version">Show QR version</string>
|
||||
<string name="show_qr_version_summary">Show QR version number.</string>
|
||||
<string name="show_qr_version">显示 QR 版本</string>
|
||||
<string name="show_qr_version_summary">显示 QR Code 的版本号</string>
|
||||
<string name="show_hex_dump">显示16进制数据</string>
|
||||
<string name="show_hex_dump_summary">显示已扫描条码的16进制数据</string>
|
||||
<string name="close_automatically">复制/分享后自动返回</string>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<item>Georgian</item>
|
||||
<item>Dutch</item>
|
||||
<item>Polski</item>
|
||||
<item>Portuguese (Brazil)</item>
|
||||
<item>Português do Brasil</item>
|
||||
<item>Russian</item>
|
||||
<item>Turkish</item>
|
||||
<item>Ukrainian</item>
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package de.markusfisch.android.binaryeye.actions.mail
|
||||
|
||||
import junit.framework.TestCase.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
class MatMsgTest {
|
||||
@Test
|
||||
fun to() {
|
||||
val mm = MatMsg(
|
||||
"MATMSG:TO:someone@example.org;;"
|
||||
)
|
||||
assertEquals(mm.to, "someone@example.org")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun toSub() {
|
||||
val mm = MatMsg(
|
||||
"MATMSG:TO:someone@example.org;SUB:Stuff;;"
|
||||
)
|
||||
assertEquals(mm.to, "someone@example.org")
|
||||
assertEquals(mm.sub, "Stuff")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun toSubBody() {
|
||||
val mm = MatMsg(
|
||||
"MATMSG:TO:someone@example.org;SUB:Stuff;BODY:This is some text;;"
|
||||
)
|
||||
assertEquals(mm.to, "someone@example.org")
|
||||
assertEquals(mm.sub, "Stuff")
|
||||
assertEquals(mm.body, "This is some text")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun differentOrder() {
|
||||
val mm = MatMsg(
|
||||
"MATMSG:SUB:Stuff;BODY:This is some text;TO:someone@example.org;;"
|
||||
)
|
||||
assertEquals(mm.to, "someone@example.org")
|
||||
assertEquals(mm.sub, "Stuff")
|
||||
assertEquals(mm.body, "This is some text")
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package de.markusfisch.android.binaryeye.actions.vtype
|
||||
|
||||
import de.markusfisch.android.binaryeye.simpleFail
|
||||
import junit.framework.TestCase.*
|
||||
import org.junit.Test
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package de.markusfisch.android.binaryeye.actions.web
|
||||
|
||||
import de.markusfisch.android.binaryeye.simpleFail
|
||||
import junit.framework.TestCase.*
|
||||
import org.junit.Test
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
Funziona con orientamento verticale e orizzontale, può leggere codici invertiti,
|
||||
è in Material Design e può anche generare codici a barre.
|
||||
|
||||
Usa la libreria di scansione di codici a barre ZXing ("Zebra Crossing").
|
||||
I formati di codici a barre supportati sono: AZTEC, CODABAR, CODE 39, CODE 93, CODE 128,
|
||||
DATA MATRIX, EAN 8, EAN 13, ITF, PDF417, QR CODE, RSS 14, RSS EXPANDED,
|
||||
UPC A, UPC E e UPC EAN EXTENSION.
|
||||
|
||||
Questa è open source:
|
||||
https://github.com/markusfisch/BinaryEye
|
||||
@@ -0,0 +1 @@
|
||||
Ancora un altro lettore di codici a barre per Android. Gratuito, senza pubblicità e open source.
|
||||
@@ -0,0 +1,10 @@
|
||||
Funciona tanto no modo vertical quanto no horizontal, pode ler códigos invertidos,
|
||||
gerar vários tipos de códigos e é feito com Material Design.
|
||||
|
||||
Utiliza a biblioteca de leitura de códigos ZXing ("Zebra Crossing").
|
||||
Os seguintes formatos de códigos são suportados: AZTEC, CODABAR, CODE 39, CODE 93,
|
||||
CODE 128, DATA MATRIX, EAN 8, EAN 13, ITF, PDF417, QR CODE, RSS 14, RSS EXPANDED,
|
||||
UPC A, UPC E e UPC EAN EXTENSION.
|
||||
|
||||
App é de software livre:
|
||||
https://github.com/markusfisch/BinaryEye
|
||||
@@ -0,0 +1 @@
|
||||
Mais um leitor de códigos QR etc. para Android. Sem anúncios e de software livre.
|
||||
@@ -1 +1 @@
|
||||
Mais um scanner de código de barras
|
||||
Mais um leitor de códigos QR etc
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Binary Eye
|
||||
Reference in New Issue
Block a user