2015-10-05 3 views
0

Я написали код для сканирования QR-кода. Но я хочу сгенерировать QR-код, беря ввод из текстового поля или любого другого источника. Я искал его, но похоже, что такого варианта нет. Я должен написать собственный код, и у меня возникла проблема с этим. Пожалуйста, направляйте меня. Я сделал это -Сгенерировать QR-код в codenameone

final TextField text = new TextField(); 
    final SpanButton qrGen = new SpanButton("Generate QR"); 
    qrGen.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      System.out.println("Comes here....."); 
      MyNative n = (MyNative)NativeLookup.create(MyNative.class) ; 
      if(n != null && n.isSupported()) { 
       String path = (String) evt.getSource(); 
       System.out.println("Comes here2....."); 
       InputStream is = null; 
       try { 
        is = com.codename1.io.FileSystemStorage.getInstance().openInputStream(path); 
        System.out.println("Comes here3....."); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Image i = null; 
       try { 
        i = Image.createImage(is); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }//(n.genQR(text.getText())); 
       ImageViewer iv = new ImageViewer(i); 
       g.removeAll(); 
       g.addComponent(iv); 
       f.addComponent(BorderLayout.SOUTH, g); 
       f.show(); 
      } 
     } 
    }); 
    g.addComponent(text); 
    g.addComponent(qrGen); 
    f.addComponent(BorderLayout.SOUTH, g); 
    f.show(); 

Объект MyNative остается нулевым, а внутренний блок никогда не достигается. Это моя родная реализация -

package com.codename1; 

import com.google.zxing.QRCodeWriter; 

public class MyNativeImpl implements MyNative { 
public Object genQR(String param) { 
    ImageView imageView = (ImageView) findViewById(R.id.qrCode); 
    try { 
     return encodeAsBitmap(STR); 
    } catch (WriterException e) { 
     e.printStackTrace(); 
    } 
} 

Bitmap encodeAsBitmap(String str) throws WriterException { 
    BitMatrix result; 
    try { 
     result = new QRCodeWriter().encode(str, 
      BarcodeFormat.QR_CODE, WIDTH, WIDTH, null); 
    } catch (IllegalArgumentException iae) { 
     // Unsupported format 
     return null; 
    } 
    int w = result.getWidth(); 
    int h = result.getHeight(); 
    int[] pixels = new int[w * h]; 
    for (int y = 0; y < h; y++) { 
     int offset = y * w; 
     for (int x = 0; x < w; x++) { 
      pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; 
     } 
    } 
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    bitmap.setPixels(pixels, 0, width, 0, 0, w, h); 
    return bitmap; 
} 

public boolean isSupported() { 
    return true; 
} 

} 

ответ

0

Нативный интерфейс будет работать только на самом устройстве.

Это не похоже, что ваш собственный интерфейс действителен, так как вы возвращаете объект из интерфейса, который является незаконным. Вы должны вернуть byte[].

Собственные аргументы/типы возврата ограничены для лучшей совместимости языков.

0

Если ваше приложение будет работать в сети, я предлагаю вам использовать Google QR code api. Он генерирует QR для вас, возвращает изображение и не требует написания собственного кода. Образец изображения Google QR here. В противном случае вы должны отлаживать свое приложение с помощью реального устройства, поскольку собственный интерфейс не будет работать на симуляторе, если вы не напишите собственный код java.

Код ниже должен помочь вам с вашим родным интерфейсом, не тестируются и написано здесь, на StackOverflow:

Android MyNativeImpl.java:

package com.yourpackage.anything; 

import com.google.zxing.QRCodeWriter; 

public class MyNativeImpl { 
public byte[] generateQRFromString(String str) throws WriterException { 
    BitMatrix result; 
    try { 
     result = new QRCodeWriter().encode(str, 
       BarcodeFormat.QR_CODE, WIDTH, WIDTH, null); 
    } catch (IllegalArgumentException iae) { 
     // Unsupported format 
     return null; 
    } 
    int w = result.getWidth(); 
    int h = result.getHeight(); 
    int[] pixels = new int[w * h]; 
    for (int y = 0; y < h; y++) { 
     int offset = y * w; 
     for (int x = 0; x < w; x++) { 
      pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; 
     } 
    } 
    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    bitmap.setPixels(pixels, 0, width, 0, 0, w, h); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 
    return byteArray; 
} 
} 

MyNative.java

package com.yourpackage.anything; 

import com.codename1.system.NativeInterface; 
public interface MyNative extends NativeInterface { 
    public byte[] generateQRFromString(String str); 
} 

Теперь вы можете преобразовать байт [], возвращенный к изображению в вашем коде CN1. Если вы не знаете, как, посмотрите CN1 Javadoc или @Shai, вы сможете помочь вам с фрагментом. На основании того, что вы пытаетесь сделать, вы можете попробовать следующее:

final TextField text = new TextField(); 
    final SpanButton qrGen = new SpanButton("Generate QR"); 
    qrGen.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      System.out.println("Comes here....."); 
      MyNative n = (MyNative) NativeLookup.create(MyNative.class); 
      if (n != null && n.isSupported()) { 
       byte[] byteData = n.generateQRFromString("Hello world"); 
       if (byteData != null) { 
        Image img = Image.createImage(byteData, 0, byteData.length); 
        ImageViewer iv = new ImageViewer(img); 
        g.removeAll(); 
        g.addComponent(iv); 
        f.addComponent(BorderLayout.SOUTH, g); 
        f.show(); 
       } else { 
        //print My native code returned no image 
       } 

      } 
     } 
    }); 
    g.addComponent(text); 
    g.addComponent(qrGen); 
    f.addComponent(BorderLayout.SOUTH, g); 
    f.show(); 
Смежные вопросы