2016-07-07 4 views
1

Jelly Bean(Android 4.3)でBluetooth機能を使用するアプリケーションを開発しました。私はLollipopのbluetoothクラスにさまざまな方法のセットがあることに気付きました。私がLollipopで自分のアプリケーションを実行すると、失敗しました。私はのように、実行時に異なるAPIレベルをサポートするためのコードを追加できることを学びましたAndroid:Bluetooth App用の単一APKで複数のAPIレベルをサポート

private void startScanBluetooth(){ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // Method supported in Lollipop 
     mLeScanner.stopScan(mScanCallback); 
    } 
    else { 
     // Method for older API level 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
    } 
} 

私のコードは私のActivityクラスではなく、任意の方法の外にあるBluetoothAdapter.LeScanCallbackています。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar); 
    setContentView(R.layout.device_list); 

    final BluetoothManager bluetoothManager = 
      (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
    mBluetoothAdapter = bluetoothManager.getAdapter(); 
    //.... 
} 

private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

      @Override 
      public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           //String targetDevice = MainActivity.targetDevice.getText().toString(); 
           //if(targetDevice==null || targetDevice.length()==0 || targetDevice.equals(device.getName())) 
           addDevice(device,rssi); 
          } 
         }); 

        } 
       }); 
      } 
     }; 

このコールバックが廃止されましたように、私は新しいコールバックメソッド必要があります:ロリポップをサポートするScanCallBackをので、私はこのような別のコールバックを追加しました:

mScanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       Log.i("callbackType", String.valueOf(callbackType)); 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        Log.i("result", result.toString()); 
        BluetoothDevice btDevice = result.getDevice(); 
        connectToDevice(btDevice); 
       } 
      } 
     } 
    }; 

それは今しかし、ロリポップで実行することができます4.4.2でそれを実行すると、クラスDeviceListActivityを実行するとアプリケーションが予期せず存在します(上記はすべてこのクラスの中にあります)。失敗したときのログ:

@Jesseための

09-02 17:42:46.469 15329-15329/com.conerstoneee2.blecaller D/OLED: Start DeviceListActivity now 
09-02 17:42:46.499 15329-15329/com.conerstoneee2.blecaller D/OLED: onPause 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: Unable to resolve superclass of Lcom/conerstoneee2/blecaller/DeviceListActivity$3; (63) 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: Link of class 'Lcom/conerstoneee2/blecaller/DeviceListActivity$3;' failed 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller E/dalvikvm: Could not find class 'com.conerstoneee2.blecaller.DeviceListActivity$3', referenced from method com.conerstoneee2.blecaller.DeviceListActivity.<init> 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to resolve new-instance 1960 (Lcom/conerstoneee2/blecaller/DeviceListActivity$3;) in Lcom/conerstoneee2/blecaller/DeviceListActivity; 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: VFY: replacing opcode 0x22 at 0x0006 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/bluetooth/le/ScanCallback;) 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller I/dalvikvm: Could not find method android.bluetooth.le.BluetoothLeScanner.startScan, referenced from method com.conerstoneee2.blecaller.DeviceListActivity.scanLeDevice 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to resolve virtual method 311: Landroid/bluetooth/le/BluetoothLeScanner;.startScan (Landroid/bluetooth/le/ScanCallback;)V 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: VFY: replacing opcode 0x6e at 0x0024 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller I/dalvikvm: Could not find method android.bluetooth.le.BluetoothLeScanner.stopScan, referenced from method com.conerstoneee2.blecaller.DeviceListActivity.scanLeDevice 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to resolve virtual method 312: Landroid/bluetooth/le/BluetoothLeScanner;.stopScan (Landroid/bluetooth/le/ScanCallback;)V 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: VFY: replacing opcode 0x6e at 0x0041 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller I/dalvikvm: Could not find method android.bluetooth.BluetoothAdapter.getBluetoothLeScanner, referenced from method com.conerstoneee2.blecaller.DeviceListActivity.onCreate 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to resolve virtual method 283: Landroid/bluetooth/BluetoothAdapter;.getBluetoothLeScanner()Landroid/bluetooth/le/BluetoothLeScanner; 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: VFY: replacing opcode 0x6e at 0x0071 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller I/dalvikvm: Could not find method android.bluetooth.le.BluetoothLeScanner.stopScan, referenced from method com.conerstoneee2.blecaller.DeviceListActivity.onDestroy 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to resolve virtual method 312: Landroid/bluetooth/le/BluetoothLeScanner;.stopScan (Landroid/bluetooth/le/ScanCallback;)V 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: VFY: replacing opcode 0x6e at 0x0014 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller I/dalvikvm: Could not find method android.bluetooth.le.BluetoothLeScanner.stopScan, referenced from method com.conerstoneee2.blecaller.DeviceListActivity.onStop 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: VFY: unable to resolve virtual method 312: Landroid/bluetooth/le/BluetoothLeScanner;.stopScan (Landroid/bluetooth/le/ScanCallback;)V 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: VFY: replacing opcode 0x6e at 0x0014 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: Unable to resolve superclass of Lcom/conerstoneee2/blecaller/DeviceListActivity$3; (63) 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: Link of class 'Lcom/conerstoneee2/blecaller/DeviceListActivity$3;' failed 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/dalvikvm: DexOpt: unable to opt direct call 0x3ea0 at 0x08 in Lcom/conerstoneee2/blecaller/DeviceListActivity;.<init> 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller D/AndroidRuntime: Shutting down VM 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41f8bda0) 
09-02 17:42:46.519 15329-15329/com.conerstoneee2.blecaller E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.conerstoneee2.blecaller, PID: 15329 
                      java.lang.NoClassDefFoundError: com.conerstoneee2.blecaller.DeviceListActivity$3 
                       at com.conerstoneee2.blecaller.DeviceListActivity.<init>(DeviceListActivity.java:181) 
                       at java.lang.Class.newInstanceImpl(Native Method) 
                       at java.lang.Class.newInstance(Class.java:1208) 
                       at android.app.Instrumentation.newActivity(Instrumentation.java:1067) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2289) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2453) 
                       at android.app.ActivityThread.access$900(ActivityThread.java:173) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:136) 
                       at android.app.ActivityThread.main(ActivityThread.java:5579) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:515) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                       at dalvik.system.NativeStart.main(Native Method) 
09-02 17:42:49.959 15329-15329/com.conerstoneee2.blecaller I/Process: Sending signal. PID: 15329 SIG: 9 

UPDATE おかげで、私は、コールバック内のビルドバージョンをチェックするためのコードを追加できることを指摘します。 APKを正常に作成できますが、現在4.4.2で実行できません。

+0

私の知る限り、これはあなたがお勧めされていない古いだけでなく、新しいAPIの他の方法を使用することが可能な唯一の方法は、だから、SDKのバージョン – dex

+0

をminにコンパイルし、ターゲットSDKを減らすためにされているものを例外/エラーの種類投稿した最初のコードスニペットを試してみるとどうなりますか? – RafToTheK

答えて

1

あなたは閉じるようです。 BluetoothAdapter.LeScanCallbackはインターフェイスです。これを行うとき:

private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

      @Override 
      public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           //String targetDevice = MainActivity.targetDevice.getText().toString(); 
           //if(targetDevice==null || targetDevice.length()==0 || targetDevice.equals(device.getName())) 
           addDevice(device,rssi); 
          } 
         }); 

        } 
       }); 
      } 
     }; 

"[あなたの]アクティビティクラスにありますが、どのメソッドの外にもあります。"このコードでは何も起こっていません。これを呼び出すと:

mLeScanner.stopScan(mScanCallback); 

を渡してパラメータとして渡します。 mLeScannerは、必要に応じてそのコールバックを使用します。

したがって、追加のコールバックメソッドを作成してください(ビルドバージョンを確認しないでください)。

private **typeNameGoesHere** mScanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      Log.i("callbackType", String.valueOf(callbackType)); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       Log.i("result", result.toString()); 
       BluetoothDevice btDevice = result.getDevice(); 
       connectToDevice(btDevice); 
      } 
     } 
    }; 

次に、startScanBluetoothメソッドをそのまま使用してください。正常に動作するはずです。

private void startScanBluetooth(){ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // Method supported in Lollipop 
     mLeScanner.stopScan(mScanCallback); 
    } 
    else { 
     // Method for older API level 
     mBluetoothAdapter.stopLeScan(mLeScanCallback); 
    } 
} 
+0

ありがとう、私は今すぐLollipopのコールバックを追加できます。 Android 6デバイスを使用しているときは、まだBluetoothデバイスをスキャンできません。 – eepty

+0

私はまだ6へのアップグレードは行っていませんが、呼び出しが変わったと思います。 [this](https://developer.android.com/reference/android/bluetooth/le/BluetoothLeScanner.html) – Jesse

+0

最後に私はAndroid 6に大きな変化があることを発見しました。私は、実行時に権限を取得し、Bluetoothデバイスをスキャンするための場所のアクセス権を取得する必要があります。 – eepty

関連する問題