2017-10-01 4 views
0

La raison principale pour laquelle je poste ici est que je suis actuellement bloqué sans un ordinateur qui peut exécuter un émulateur, j'ai dû envoyer l'APK sur mon téléphone pour le tester. Même si mon téléphone est connecté à mon ordinateur ou si un émulateur tiers est en cours d'exécution, cela ne fonctionnera pas. Pour cette raison ... Je n'ai pas de journaux d'erreurs. L'application est un gestionnaire de mot de passe simple, et toutes les autres fonctions fonctionnent jusqu'à présent. J'essayais d'ajouter une fonction d'exportation, je n'arrive pas à écrire quoi que ce soit. J'ai vérifié d'autres questions et diverses sources en ligne, mais je n'arrive pas à comprendre ce qui pourrait en être la cause. Lorsque la méthode est appelée, elle ne fait rien pour autant que je sache. Je m'excuse si quelque chose me manque, ou s'il y avait effectivement une autre question avec le même problème. Je n'ai rien trouvé de manquant.La demande d'autorisations d'exécution provoque un crash

Voici la méthode que j'utilise;

EDIT: Le code a été mis à jour pour refléter une meilleure méthode de demandant des autorisations d'exécution, qui a été suggéré here. C'est finalement ce qui fixe l'application.

//Method017: Exports the account info to a .txt file. 
    public void exportData() throws IOException { 

     //Opens dialog to request permission. 
     ActivityCompat.requestPermissions(Main.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
    } 

    //Method to handle result of permission request. 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case 1: { 

       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        //Attempt to write a file to the Download folder. 
        String content = "hello world"; 
        File file; 
        FileOutputStream outputStream; 
        try { 
         file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "MyCache"); 

         outputStream = new FileOutputStream(file); 
         outputStream.write(content.getBytes()); 
         outputStream.close(); 

         //According to an online source, this is necessary to make the file viewable on the device. 
         Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
         intent.setData(Uri.fromFile(file)); 
         sendBroadcast(intent); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

       } else { 

        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(Main.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show(); 
       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

Et mon manifeste:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.brand.psync"> 

    <application 

     android:allowBackup="true" 
     android:icon="@drawable/psynclogo" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     android:screenOrientation="portrait"> 
     <activity android:name=".Main"> 
      <intent-filter> 
       <action 
        android:name="android.intent.action.MAIN" 
        android:screenOrientation="portrait" /> 
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
       <category 
        android:name="android.intent.category.LAUNCHER" 
        android:screenOrientation="portrait" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
</manifest> 

Désolé de l'absence de journal des erreurs ... mais si je devais, je serais probablement pas besoin de poster ici.

+1

Quelle est la version sdk cible que vous avez mentionnée dans le fichier build.gradle. Si c'est au-dessus de 22, vous devez demander l'autorisation WRITE_EXTERNAL_STORAGE au moment de l'exécution –

+0

Min est 15 mais la cible est 26, et je la teste sur 24 ... Cela pourrait très bien être, je vais y jeter un coup d'oeil. – Prometheus

+1

Si vous ne pouvez pas fournir la trace de la pile, utilisez Toast pour afficher 'e.getMessage()' dans le bloc catch et afficher le message d'erreur. –

Répondre

1

J'ai essayé votre code et cela fonctionne.

public class SaveFileSampleActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     TextView lblBackground = new TextView(this); 
     lblBackground.setBackgroundColor(Color.WHITE); 
     setContentView(lblBackground); 

     ActivityCompat.requestPermissions(SaveFileSampleActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case 1: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        //Attempt to write a file to the Download folder. 
        String content = "hello world"; 
        File file; 
        FileOutputStream outputStream; 
        try { 
         file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "MyCache"); 

         outputStream = new FileOutputStream(file); 
         outputStream.write(content.getBytes()); 
         outputStream.close(); 

         //According to an online source, this is necessary to make the file viewable on the device. 
         Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
         intent.setData(Uri.fromFile(file)); 
         sendBroadcast(intent); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } else { 

        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(SaveFileSampleActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show(); 
       } 
       return; 
      } 
      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 
} 

Et mainifest

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".SaveFileSampleActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Il est le travail et le résultat: enter image description here

Vous pouvez vérifier votre code. J'espère que cela peut vous aider!

+0

Je suis confus, il semble que tout ce que vous avez changé était de supprimer la permission du manifeste? Une autre différence que je vois est que j'utilise "extends AppCompatActivity {" au lieu de "extends Activity {" Quelle version d'android avez-vous testé? – Prometheus

+0

Toujours des plantages sur mon appareil ... – Prometheus

+0

Je cours sur l'émulateur nexus 5 créé par android studio. – Dungnbhut