2017-09-12 3 views
1

Intend:
J'essaie de développer une application à usage unique, que vous ne pouvez pas quitter. Il devrait fonctionner sur un téléphone comme un "système d'exploitation". Ce téléphone sera utilisé à d'autres fins. L'application ne sera pas dans le magasin de jeu et vous ne pouvez pas le quitter, donc je dois le mettre à jour sinon si j'ai des versions plus récentes. A cet effet, j'ai écrit une autre application que vous pourriez appeler "updater-app". Je veux faire cette mise à jour via Bluetooth. J'ai déjà tout préparé et il est prêt pour le transfert de fichiers. Les téléphones peuvent se connecter par un InsecureRfcommSocket. J'ai aussi réussi à sélectionner le fichier .apk que je veux envoyer un chooser sur l'updater-app et je suis en convertissant le uri octets dans le présent Code:Transfert de fichiers Bluetooth Android .apk

sendUpdateButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mBtService != null) { 
       Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
       intent.setType("application/vnd.android.package-archive"); 
       intent.addCategory(Intent.CATEGORY_OPENABLE); 

       try { 
        startActivityForResult(Intent.createChooser(intent, "Choose .apk"), FILE_SELECT_CODE); 
       } catch (android.content.ActivityNotFoundException ex) { 
        Toast.makeText(getApplicationContext(), "No File-Explorer found", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
    }); 

et onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK && data != null) { 
     Uri selectedFile = data.getData(); 
     try { 
      byte[] sendingByte = readBytes(selectedFile); 
      mBtService.send(sendingByte); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Toast.makeText(getApplicationContext(), R.string.transmissionFailed, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

la fonction readBytes:

public byte[] readBytes(Uri uri) throws IOException { 
    InputStream inputStream = getContentResolver().openInputStream(uri); 
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 
    int len = 0; 
    while ((len = inputStream.read(buffer)) != -1) { 
     byteBuffer.write(buffer, 0, len); 
    } 
    return byteBuffer.toByteArray(); 
} 

avec la ligne mBtService.send(sendingByte) la fonction suivante est appelée dans le ConnectedThread:

 public void send(byte[] selectedFile) { 
     try { 
      mmOutStream.write(selectedFile); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Problème:
Dans le téléphone récepteur a aucune idée Ive comment recevoir les octets et le convertir en un fichier/uri (aucune idée encore) .apk et enregistrez-le sur mon téléphone pour exécuter avec un autre bouton qui ne fait pas partie de cette question.

Question:
Donc, ma question est de savoir quoi dans le code de l'application de téléphone récepteur pour gérer finir mon intention? Si j'ai manqué de poster un code pertinent, je suis désolé et je vais l'ajouter à votre demande. Comme je dois programmer ces deux applications pour mes études je suis reconnaissant pour toute aide.

Répondre

0

J'ai trouvé une solution pour enregistrer les octets reçus dans un ByteArray et ensuite l'enregistrer dans un fichier. Dans mon Bluetooth ConnectedThread je la méthode run() suivant:

public void run() { 
     Log.i(TAG, "BEGIN mConnectedThread"); 
     byte[] buffer = new byte[1024]; 
     int len; 
     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
     try { 
      while ((len = mmInStream.read(buffer)) != -1) { 
       byteBuffer.write(buffer, 0, len); 
       mHandler.obtainMessage(Constants.MESSAGE_READ, len, -1, byteBuffer.toByteArray()) 
         .sendToTarget(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      connectionLost(); 
     } 
    } 

Et dans mon activité je les suivantes Handler MESSAGE_READ:

private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case Constants.MESSAGE_STATE_CHANGE: 
       ... 
       break; 
      case Constants.MESSAGE_READ: 
       byte[] buffer = (byte[]) msg.obj; 
       try { 
        String filePath = Environment.getExternalStorageDirectory() + "/download/app.apk"; 
        File file = new File(filePath); 
        file.getParentFile().mkdirs(); 
        if (file.exists()) { 
         file.delete(); 
         file.createNewFile(); 
        } 
        else 
         file.createNewFile(); 
        BufferedOutputStream objectOut = new BufferedOutputStream(new FileOutputStream(file)); 
        objectOut.write(buffer); 
        objectOut.close(); 
        } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       break; 
     } 
    } 
}; 

Avec ce code le .apk est enregistré à la régulière Télécharger dossier comme "app.apk".

Espérons que ceci est utile pour n'importe qui.