2010-12-04 3 views
8

Je suis très nouveau dans le développement d'applications Android, et j'espère que je poste ceci au bon endroit. J'essaie d'apprendre comment obtenir le téléphone bluetooth pour se connecter à mon module Bluetooth. J'essaie d'utiliser le code que j'ai trouvé dans un livre de référence, mais il me donne une erreur. J'ai déjà écrit en java mais j'ai du mal à comprendre la structure d'une application Android. De toute façon l'erreur que j'obtiens est Unknown Error: java.lang.nullPointerException. Suis-je en train d'oublier d'importer une bibliothèque dont j'ai besoin, ou ai-je fait une erreur d'emballage lors de la création du projet? Voici le code:Débutant Développeur: Inconnu Erreur: java.lang.nullPointerException

package android.app.bluetooth; 
//import java.io.InputStream; 
//import java.io.OutputStream; 
import java.util.ArrayList; 
import java.util.UUID; 
import java.io.IOException; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
//import android.os.Handler; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothServerSocket; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
//import android.view.View.OnKeyListener; 
import android.widget.ArrayAdapter; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView;  
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 

public class bluetooth extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //Get the bluetooth adapter (phone) 
    configureBluetooth(); 

    //Setup ListView of discovered devices 
    setupListView(); 

    //Setup search button 
    setupSearchButton(); 

    //Setup listen button 
    setupListenButton(); 
} 

private BluetoothAdapter bluetooth; 
private BluetoothSocket socket; 
private UUID uuid = UUID.fromString("985c75a3-66ae-4b5b-9fac-894659d6f6ee"); 
private void configureBluetooth(){ 
    BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); 
    } 

//Create switchUI method that will be called once a connection is 
//established to enable views for reading and writing messages 
private ListView list; 
private void switchUI(){ 
    final TextView messageText = (TextView)findViewById(R.id.text_messages); 
    final EditText textEntry = (EditText)findViewById(R.id.text_message); 

    messageText.setVisibility(View.VISIBLE); 
    list.setVisibility(View.GONE); 
    textEntry.setEnabled(true); 
    } 

//Create server listener. Listen button will prompt user to enable discovery 
//When discovery window returns, open bluetooth socket to listen for connection  requests for discovery duration 
//Once a connection has been made, make a call to switchUI 

private static int DISCOVERY_REQUEST = 1; 
private void setupListenButton(){ 
Button listenButton = (Button)findViewById(R.id.button_listen); 
listenButton.setOnClickListener(new OnClickListener(){ 
    public void onClick(View view){ 
    Intent disc; 
    disc = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
    startActivityForResult(disc, DISCOVERY_REQUEST); 
     } 
    }); 
    } 

//Find out if user has accepted or rejected the request 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if(requestCode == DISCOVERY_REQUEST){ 
    boolean isDiscoverable = resultCode > 0; 
    if (isDiscoverable){ 
     String name = "bluetoothserver"; 
     try{ 
     final BluetoothServerSocket btserver = bluetooth.listenUsingRfcommWithServiceRecord(name, uuid); 
     AsyncTask<Integer, Void, BluetoothSocket> acceptThread = new AsyncTask<Integer, Void, BluetoothSocket>(){ 
     @Override 
     protected BluetoothSocket doInBackground(Integer ... params){ 
     try{ 
      socket = btserver.accept(params[0]*1000); 
      return socket; 
      } catch (IOException e){ 
      Log.d("BLUETOOTH", e.getMessage()); 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(BluetoothSocket result){ 
      if (result != null) 
      switchUI(); 
     } 
     }; 
     acceptThread.execute(resultCode); 
     } catch (IOException e){ 
     Log.d("BLUETOOTH", e.getMessage()); 
     } 
     } 
     //int discoverableDuration = resultCode; 
    } 
    } 

//Provide a means for client device to search for listening server 
private ArrayAdapter<BluetoothDevice> aa; 
private ArrayList<BluetoothDevice> foundDevices; 
private void setupListView(){ 
    aa = new ArrayAdapter<BluetoothDevice>(this, android.R.layout.simple_list_item_1, foundDevices); 
    list = (ListView)findViewById(R.id.list_discovered); 
    list.setAdapter(aa); 

    //Include onItemClickListener that will attempt to asynchronously initiate a client-side connection 
    //with the selected remote Bluetooth Device 
    //If successful, keep a reference to the socket it creates and make a call to switchUI 
    list.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> arg0, View view, int index, long arg3){ 
     AsyncTask<Integer, Void, Void> connectTask = new AsyncTask<Integer, Void, Void>(){ 
     @Override 
     protected Void doInBackground(Integer ... params){ 
     try{ 
     BluetoothDevice device = foundDevices.get(params[0]); 
     socket = device.createRfcommSocketToServiceRecord(uuid); 
     socket.connect(); 
     } catch(IOException e){ 
     Log.d("BLUETOOTH_CLIENT", e.getMessage()); 
     } 
     return null; 
     } 

     @Override 
     protected void onPostExecute(Void result){ 
     switchUI(); 
     } 
     }; 
     connectTask.execute(index); 
     } 
    }); 
    } 

//Create a broadcast receiver that listens for Bluetooth Device discovery broadcasts, 
//adds each discovered device to the array of found devices and notifies the Array Adapter 
//Discover remote bluetooth devices 
BroadcastReceiver discoveryResult = new BroadcastReceiver(){ 
@Override 
public void onReceive(Context context, Intent intent){ 
//String remoteDeviceName = intent.getStringName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME); 
BluetoothDevice remoteDevice; //remote bluetooth device 
remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
if(bluetooth.getBondedDevices().contains(remoteDevice)){ 
    foundDevices.add(remoteDevice); 
    aa.notifyDataSetChanged(); 
    } 
} 
}; 

    //Register Broadcast Receiver and initiate discovery session 
    private void setupSearchButton(){ 
    Button searchButton = (Button)findViewById(R.id.button_search); 

    searchButton.setOnClickListener(new OnClickListener(){ 
     public void onClick(View view){ 
     registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 

     if (!bluetooth.isDiscovering()){ 
     foundDevices.clear(); 
     bluetooth.startDiscovery(); 
     } 
     } 
    }); 
    } 
} 

Ceci est le fichier de mise en page:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<EditText 
android:id="@+id/text_message" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:enabled="false" 
/> 
<Button 
android:id="@+id/button_search" 
android:text="Search for listener" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_above="@id/text_message" 
/> 
<Button 
android:id="@+id/button_listen" 
android:text="Listen for connection" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_above="@id/button_search" 
/> 
<ListView 
android:id="@+id/list_discovered" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_above="@id/button_listen" 
android:layout_alignParentTop="true" 
/> 
<TextView 
android:id="@+id/text_messages" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_above="@id/button_listen" 
android:layout_alignParentTop="true" 
android:visibility="gone" 
/> 
</RelativeLayout> 

et voici le fichier manifeste:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    android:versionCode="1" 
    android:versionName="1.0" package="android.app.bluetooth"> 
<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".bluetooth" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

</application> 
<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
</manifest> 

Comme je l'ai dit que je suis très nouveau à cette façon Je m'excuse si cela n'a pas beaucoup de sens mais toute aide serait grandement appréciée.

+4

Vous postez au bon endroit. Plus important encore, nous devons voir la trace de la pile qui aboutit à l'exception nullPointerException. Veuillez mettre à jour la question avec la trace de la pile. (S'il vous manquait une importation ou une référence, alors le programme ne compilerait pas.) – cfeduke

+0

Pardonnez-moi mais comment faire? J'ai essayé d'ajouter Thread.dumpStack(); mais quand j'essaie de lancer le programme, il est dit "Votre projet contient des erreurs, corrigez-les avant d'exécuter votre application". – Patty

+1

ajouter le vidage d'erreur de logcat –

Répondre

2

Essayez de le déboguer étape par étape. De cette façon, vous trouverez la cause de l'exception NullPointerException. Certains champs accédés seront probablement NULL. Une fois que vous savez quel domaine, vous pouvez empêcher la NullPointerException en donnant ledit champ une valeur par défaut ..

0

projet supprimer de l'espace de travail et l'importation, il est à nouveau la meilleure façon de résoudre ce problème (si le chat journal est vide) ..

0

Je viens de corriger ce problème dans mon environnement. J'avais une ressource (code source) liée à mon projet. Lorsque j'ai rouvert le projet dans un espace de travail différent, il n'a pas réussi à ouvrir les fichiers. Pour vous débarrasser rapidement de l'exception du pointeur nul, vous pouvez essayer ceci.
Quitter Eclipse
Ouvrez le fichier .project et supprimez la section.
Redémarrez Eclipse, nettoyez et créez
Vous pouvez maintenant voir l'erreur réelle. Vous pouvez maintenant le corriger dans les propriétés du projet.

Bonne chance!

Crédits: http://blog.thehappydeveloper.com/?p=112

0

j'ai pu résoudre ce problème par:

  1. Ouverture mon fichier .project et la suppression d'une entrée à une bibliothèque liée incorrecte
  2. Ouverture du fichier .classpath et supprimer la référence à la même bibliothèque incorrectement liée que celle qui a été supprimée à l'étape 1
0

vérifiez votre projet.prop erties dans votre dossier de projet il peut avoir des entrées invalides

0

J'ai eu le même problème. Il s'agissait d'un projet de bibliothèque fermée qui a été référencé à partir de mon projet. Alors

  • clic droit sur le nom du projet
  • cliquez sur les propriétés
  • sélectionnez android
  • et en partie de la bibliothèque pour vérifier une référence non valide.
  • et s'il existe un projet fermé (tel que Android appcompat) essayez de l'ouvrir.
1

Pour moi, ce fut un problème de dépendance ,

essentiellement un projet a été inclus deux fois. Le message d'erreur comme ceci est également arrivé seulement avec Android ADT Eclipse Version.

Fondamentalement, il y avait
Projet A -> Nécessite la bibliothèque B.
Mais il y avait aussi
Projet A -> Besoin de dépendance C.

Mais De plus,
Dépendance C-> aussi eu dépendance à la bibliothèque B.

Donc Bibliothèque B était là deux fois.
Espérons que la solution est claire, qui était le problème pour moi :)

Hope it helps :) Cheers, Mike

0

Faites un clic droit sur le projet -> propriétés -> android -> vérifier les références dans la fenêtre de droite voir si toutes les bibliothèques de référence sont présentes dans l'espace de travail et aucune n'est fermée

3

Dans mon cas, cela avait à voir avec le fait que j'avais une référence à un projet inutilisé, appcompat_v7 (c'est une bibliothèque de compatibilité pour le barre d'action pour travailler sur android plus âgé).

Comment je l'ai résolu:

faites un clic droit sur le projet, Propriétés, l'onglet Android, de supprimer la mention bibliothèque.

Supprimé tous les projets dans l'Explorateur de packages (ne les supprimait pas du disque).

J'importé mon projet à nouveau, comme ceci:

clic droit, l'importation, les projets existants dans WorkSpace, sélectionnez le dossier du projet.

Puis je l'ai reconstruit, et il y avait quelques erreurs, quelques ressources manquantes dans les fichiers styles.xml. J'ai supprimé les fichiers styles.xml, car je n'en avais pas besoin.

J'ai supprimé cette entrée de androidmanifest.xml: android: theme = "@ style/AppTheme".