2017-09-26 80 views
1

我正在开发一个术语项目,我是新来的Java和Android应用程序开发人员。不过,我有其他编程语言的经验。我正在尝试对应用程序进行反向工程,以使其能够通过蓝牙连接并发送数据。我想列出所有可用的蓝牙设备,一个打开/关闭蓝牙的按钮,一个用于使手机可用于其他设备,另一个用于搜索未配对的设备。但每次我将OnClickListener添加到onCreate方法时,应用程序在打开之前都会崩溃。任何人都可以帮我吗?添加OnClickListener会导致应用程序崩溃

的应用程序,我想修改的源代码可以在这里找到: https://github.com/pazaan/600SeriesAndroidUploader

这里,似乎部分以使它崩溃:

lvNewDevices.setOnItemClickListener(MainActivity.this); 


     btnONOFF.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Log.d(TAG, "onClick: enabling/disabling bluetooth."); 
       enableDisableBT(); 
      } 
     }); 

     btnStartConnection.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startConnection(); 
      } 
     }); 

     btnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       byte[] bytes = etSend.getText().toString().getBytes(Charset.defaultCharset()); 
       mBluetoothConnection.write(bytes); 
      } 
     }); 

这里是所有的OnCreate的:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.i(TAG, "onCreate called"); 
     super.onCreate(savedInstanceState); 


     Button btnONOFF = (Button) findViewById(R.id.btnONOFF); 

     btnEnableDisable_Discoverable = (Button) findViewById(R.id.btnDiscoverable_on_off); 

     lvNewDevices = (ListView) findViewById(R.id.lvNewDevices); 

     mBTDevices = new ArrayList<>(); 


     btnStartConnection = (Button) findViewById(R.id.btnStartConnection); 

     //Broadcasts when bond state changes (ie:pairing) 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); 
     registerReceiver(mBroadcastReceiver4, filter); 

     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     //FUCKUP: 
     lvNewDevices.setOnItemClickListener(MainActivity.this); 


     btnONOFF.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Log.d(TAG, "onClick: enabling/disabling bluetooth."); 
       enableDisableBT(); 
      } 
     }); 

     btnStartConnection.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       startConnection(); 
      } 
     }); 

     btnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       byte[] bytes = etSend.getText().toString().getBytes(Charset.defaultCharset()); 
       mBluetoothConnection.write(bytes); 
      } 
     }); 




     mRealm = Realm.getDefaultInstance(); 

     RealmResults<PumpStatusEvent> data = mRealm.where(PumpStatusEvent.class) 
       .findAllSorted("eventDate", Sort.DESCENDING); 
     if (data.size() > 0) 
      dataStore.setLastPumpStatus(data.first()); 

     setContentView(R.layout.activity_main); 

     PreferenceManager.getDefaultSharedPreferences(getBaseContext()).registerOnSharedPreferenceChangeListener(this); 
     prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 

     if (!prefs.getBoolean(getString(R.string.preference_eula_accepted), false)) { 
      stopCgmService(); 
     } 

     // setup preferences 
     configurationStore.setPollInterval(Long.parseLong(prefs.getString("pollInterval", Long.toString(MedtronicCnlIntentService.POLL_PERIOD_MS)))); 
     configurationStore.setLowBatteryPollInterval(Long.parseLong(prefs.getString("lowBatPollInterval", Long.toString(MedtronicCnlIntentService.LOW_BATTERY_POLL_PERIOD_MS)))); 
     configurationStore.setReducePollOnPumpAway(prefs.getBoolean("doublePollOnPumpAway", false)); 

     chartZoom = Integer.parseInt(prefs.getString("chartZoom", "3")); 
     configurationStore.setMmolxl(prefs.getBoolean("mmolxl", false)); 
     configurationStore.setMmolxlDecimals(prefs.getBoolean("mmolDecimals", false)); 

     // Disable battery optimization to avoid missing values on 6.0+ 
     // taken from https://github.com/NightscoutFoundation/xDrip/blob/master/app/src/main/java/com/eveningoutpost/dexdrip/Home.java#L277L298 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      final String packageName = getPackageName(); 
      final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 

      if (!pm.isIgnoringBatteryOptimizations(packageName)) { 
       Log.d(TAG, "Requesting ignore battery optimization"); 
       try { 
        // ignoring battery optimizations required for constant connection 
        // to peripheral device - eg CGM transmitter. 
        final Intent intent = new Intent(); 
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 
        intent.setData(Uri.parse("package:" + packageName)); 
        startActivity(intent); 
       } catch (ActivityNotFoundException e) { 
        Log.d(TAG, "Device does not appear to support battery optimization whitelisting!"); 
       } 
      } 
     } 

     LocalBroadcastManager.getInstance(this).registerReceiver(
       statusMessageReceiver, 
       new IntentFilter(MedtronicCnlIntentService.Constants.ACTION_STATUS_MESSAGE)); 
     LocalBroadcastManager.getInstance(this).registerReceiver(
       new UpdatePumpReceiver(), 
       new IntentFilter(MedtronicCnlIntentService.Constants.ACTION_UPDATE_PUMP)); 

     mEnableCgmService = Eula.show(this, prefs); 

     IntentFilter batteryIntentFilter = new IntentFilter(); 
     batteryIntentFilter.addAction(Intent.ACTION_BATTERY_LOW); 
     batteryIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 
     batteryIntentFilter.addAction(Intent.ACTION_BATTERY_OKAY); 
     registerReceiver(batteryReceiver, batteryIntentFilter); 

     IntentFilter usbIntentFilter = new IntentFilter(); 
     usbIntentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
     usbIntentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
     usbIntentFilter.addAction(MedtronicCnlIntentService.Constants.ACTION_USB_PERMISSION); 
     registerReceiver(usbReceiver, usbIntentFilter); 
     LocalBroadcastManager.getInstance(this).registerReceiver(
       usbReceiver, 
       new IntentFilter(MedtronicCnlIntentService.Constants.ACTION_NO_USB_PERMISSION)); 
     LocalBroadcastManager.getInstance(this).registerReceiver(
       usbReceiver, 
       new IntentFilter(MedtronicCnlIntentService.Constants.ACTION_USB_REGISTER)); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 

     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
      getSupportActionBar().setElevation(0); 
      getSupportActionBar().setTitle("Nightscout"); 
     } 

     final PrimaryDrawerItem itemSettings = new PrimaryDrawerItem() 
       .withName("Settings") 
       .withIcon(GoogleMaterial.Icon.gmd_settings) 
       .withSelectable(false); 
     final PrimaryDrawerItem itemRegisterUsb = new PrimaryDrawerItem() 
       .withName("Registered devices") 
       .withIcon(GoogleMaterial.Icon.gmd_usb) 
       .withSelectable(false); 
     final PrimaryDrawerItem itemStopCollecting = new PrimaryDrawerItem() 
       .withName("Stop collecting data") 
       .withIcon(GoogleMaterial.Icon.gmd_power_settings_new) 
       .withSelectable(false); 
     final PrimaryDrawerItem itemGetNow = new PrimaryDrawerItem() 
       .withName("Read data now") 
       .withIcon(GoogleMaterial.Icon.gmd_refresh) 
       .withSelectable(false); 
     final PrimaryDrawerItem itemUpdateProfile = new PrimaryDrawerItem() 
       .withName("Update pump profile") 
       .withIcon(GoogleMaterial.Icon.gmd_insert_chart) 
       .withSelectable(false); 
     final PrimaryDrawerItem itemClearLog = new PrimaryDrawerItem() 
       .withName("Clear log") 
       .withIcon(GoogleMaterial.Icon.gmd_clear_all) 
       .withSelectable(false); 
     final PrimaryDrawerItem itemCheckForUpdate = new PrimaryDrawerItem() 
       .withName("Check for App update") 
       .withIcon(GoogleMaterial.Icon.gmd_update) 
       .withSelectable(false); 

     assert toolbar != null; 
     new DrawerBuilder() 
       .withActivity(this) 
       .withAccountHeader(new AccountHeaderBuilder() 
         .withActivity(this) 
         .withHeaderBackground(R.drawable.drawer_header) 
         .build() 
       ) 
       .withTranslucentStatusBar(false) 
       .withToolbar(toolbar) 
       .withActionBarDrawerToggle(true) 
       .withSelectedItem(-1) 
       .addDrawerItems(
         itemSettings, 
         //itemUpdateProfile, // TODO - re-add when we to add Basal Profile Upload 
         itemRegisterUsb, 
         itemCheckForUpdate, 
         itemClearLog, 
         itemGetNow, 
         itemStopCollecting 
       ) 
       .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
        @Override 
        public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { 
         if (drawerItem.equals(itemSettings)) { 
          openSettings(); 
         } else if (drawerItem.equals(itemRegisterUsb)) { 
          openUsbRegistration(); 
         } else if (drawerItem.equals(itemStopCollecting)) { 
          mEnableCgmService = false; 
          stopCgmService(); 
          finish(); 
         } else if (drawerItem.equals(itemGetNow)) { 
          // It was triggered by user so start reading of data now and not based on last poll. 
          sendStatus("Requesting poll now..."); 
          startCgmService(System.currentTimeMillis() + 1000); 
         } else if (drawerItem.equals(itemClearLog)) { 
          clearLogText(); 
         } else if (drawerItem.equals(itemCheckForUpdate)) { 
          checkForUpdateNow(); 
         } 

         return false; 
        } 
       }) 
       .build(); 

     mTextViewLog = (TextView) findViewById(R.id.textview_log); 
     mScrollView = (ScrollView) findViewById(R.id.scrollView); 
     mScrollView.setSmoothScrollingEnabled(true); 

     mChart = (GraphView) findViewById(R.id.chart); 

     // disable scrolling at the moment 
     mChart.getViewport().setScalable(false); 
     mChart.getViewport().setScrollable(false); 
     mChart.getViewport().setYAxisBoundsManual(true); 
     mChart.getViewport().setMinY(80); 
     mChart.getViewport().setMaxY(120); 
     mChart.getViewport().setXAxisBoundsManual(true); 
     final long now = System.currentTimeMillis(), 
       left = now - chartZoom * 60 * 60 * 1000; 

     mChart.getViewport().setMaxX(now); 
     mChart.getViewport().setMinX(left); 

// due to bug in GraphView v4.2.1 using setNumHorizontalLabels reverted to using v4.0.1 and setOnXAxisBoundsChangedListener is n/a in this version 
/* 
     mChart.getViewport().setOnXAxisBoundsChangedListener(new Viewport.OnXAxisBoundsChangedListener() { 
      @Override 
      public void onXAxisBoundsChanged(double minX, double maxX, Reason reason) { 
       double rightX = mChart.getSeries().get(0).getHighestValueX(); 
       hasZoomedChart = (rightX != maxX || rightX - chartZoom * 60 * 60 * 1000 != minX); 
      } 
     }); 
*/ 
     mChart.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       if (!mChart.getSeries().isEmpty() && !mChart.getSeries().get(0).isEmpty()) { 
        double rightX = mChart.getSeries().get(0).getHighestValueX(); 
        mChart.getViewport().setMaxX(rightX); 
        mChart.getViewport().setMinX(rightX - chartZoom * 60 * 60 * 1000); 
       } 
       hasZoomedChart = false; 
       return true; 
      } 
     }); 
     mChart.getGridLabelRenderer().setNumHorizontalLabels(6); 

// due to bug in GraphView v4.2.1 using setNumHorizontalLabels reverted to using v4.0.1 and setHumanRounding is n/a in this version 
//  mChart.getGridLabelRenderer().setHumanRounding(false); 

     mChart.getGridLabelRenderer().setLabelFormatter(
       new DefaultLabelFormatter() { 
        DateFormat mFormat = new SimpleDateFormat("HH:mm", Locale.US); // 24 hour format forced to fix label overlap 

        @Override 
        public String formatLabel(double value, boolean isValueX) { 
         if (isValueX) { 
          return mFormat.format(new Date((long) value)); 
         } else { 
          return MainActivity.strFormatSGV(value); 
         } 
        } 
       } 
     ); 
    } 

这里是logcat的输出:

09-26 12:38:19.826 6324-6324/? I/art: Late-enabling -Xcheck:jni 
09-26 12:38:20.157 6324-6324/info.nightscout.android E/Fabric: Failure onPreExecute() 
                   java.lang.IllegalArgumentException: Fabric could not be initialized, API key missing from AndroidManifest.xml. Add the following tag to your Application element 
                   <meta-data android:name="io.fabric.ApiKey" android:value="YOUR_API_KEY"/> 
                    at io.fabric.sdk.android.services.common.ApiKey.logErrorOrThrowException(ApiKey.java:110) 
                    at io.fabric.sdk.android.services.common.ApiKey.getValue(ApiKey.java:61) 
                    at com.crashlytics.android.core.CrashlyticsCore.onPreExecute(CrashlyticsCore.java:219) 
                    at com.crashlytics.android.core.CrashlyticsCore.onPreExecute(CrashlyticsCore.java:207) 
                    at io.fabric.sdk.android.InitializationTask.onPreExecute(InitializationTask.java:44) 
                    at io.fabric.sdk.android.services.concurrency.AsyncTask.executeOnExecutor(AsyncTask.java:611) 
                    at io.fabric.sdk.android.services.concurrency.PriorityAsyncTask.executeOnExecutor(PriorityAsyncTask.java:43) 
                    at io.fabric.sdk.android.Kit.initialize(Kit.java:69) 
                    at io.fabric.sdk.android.Fabric.initializeKits(Fabric.java:440) 
                    at io.fabric.sdk.android.Fabric.init(Fabric.java:384) 
                    at io.fabric.sdk.android.Fabric.setFabric(Fabric.java:342) 
                    at io.fabric.sdk.android.Fabric.with(Fabric.java:313) 
                    at info.nightscout.android.UploaderApplication.onCreate(UploaderApplication.java:32) 
                    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1046) 
                    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5402) 
                    at android.app.ActivityThread.-wrap2(ActivityThread.java) 
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1541) 
                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6123) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
09-26 12:38:20.202 6324-6379/info.nightscout.android E/Fabric: Error dealing with settings 
                   java.lang.IllegalArgumentException: Fabric could not be initialized, API key missing from AndroidManifest.xml. Add the following tag to your Application element 
                   <meta-data android:name="io.fabric.ApiKey" android:value="YOUR_API_KEY"/> 
                    at io.fabric.sdk.android.services.common.ApiKey.logErrorOrThrowException(ApiKey.java:110) 
                    at io.fabric.sdk.android.services.common.ApiKey.getValue(ApiKey.java:61) 
                    at io.fabric.sdk.android.services.settings.Settings.initialize(Settings.java:78) 
                    at io.fabric.sdk.android.Onboarding.retrieveSettingsData(Onboarding.java:124) 
                    at io.fabric.sdk.android.Onboarding.doInBackground(Onboarding.java:99) 
                    at io.fabric.sdk.android.Onboarding.doInBackground(Onboarding.java:45) 
                    at io.fabric.sdk.android.InitializationTask.doInBackground(InitializationTask.java:63) 
                    at io.fabric.sdk.android.InitializationTask.doInBackground(InitializationTask.java:28) 
                    at io.fabric.sdk.android.services.concurrency.AsyncTask$2.call(AsyncTask.java:311) 
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) 
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                    at java.lang.Thread.run(Thread.java:761) 
09-26 12:38:20.252 6324-6324/info.nightscout.android W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
09-26 12:38:20.349 6324-6324/info.nightscout.android I/MainActivity: onCreate called 
09-26 12:38:20.652 6324-6324/info.nightscout.android D/AndroidRuntime: Shutting down VM 
09-26 12:38:20.652 6324-6324/info.nightscout.android E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: info.nightscout.android, PID: 6324 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{info.nightscout.android/info.nightscout.android.medtronic.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) 
                      at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6123) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
                      at info.nightscout.android.medtronic.MainActivity.onCreate(MainActivity.java:349) 
                      at android.app.Activity.performCreate(Activity.java:6672) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)  
                      at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:154)  
                      at android.app.ActivityThread.main(ActivityThread.java:6123)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)  
+1

发布logcat输出。 –

+0

你有没有尝试单步执行代码? –

+0

现在发布Logcat输出。 –

回答

4

移动代码setContentView(R.layout.activity_main);super.onCreate(savedInstanceState);

+0

好找的人 –

+0

是高超:) :) :) – iamsankalp89

+0

谢谢:)但是,这并没有让它不幸崩溃。 –

0

您在代码中添加布局之前绘制的意见。您的onCreate()应该是

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.i(TAG, "onCreate called"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //Do mapping all views 
0

您的错误日志向您显示您的解决方案。该项目正在使用Fabric API。所以很自然地,您需要将Fabric API密钥添加到您的项目中。

按照错误日志中的建议操作。在Android Manifest中添加以下行。

<meta-data android:name="io.fabric.ApiKey" android:value="YOUR_API_KEY"/> 

对于您的API密钥,使用Fabric帐户创建一个项目并获取您的API密钥。