recherche

Maison  >  Questions et réponses  >  le corps du texte

android - 关于5.0手机外置SD卡写入数据的问题

要将视频缓存到SD卡,有的手机可以写入有的手机不可以,比如HTC D826W就无法写入
下面是我在HTC D826W上的测试代码:

findViewById(R.id.btn_create_file).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            File[] externalFiles = getExternalFilesDirs(null);
            if(externalFiles.length > 1 && externalFiles[1] != null){
                File parent = externalFiles[1];
                Log.d(TAG, parent.canWrite() ? "可以写入" : "不可写入");
                try {
                    File newFile = new File(parent, System.currentTimeMillis()+"");
                    boolean createResult = newFile.createNewFile();
                    Log.d(TAG, createResult ? "创建文件成功" : "创建文件失败");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

上面的代码会报这个错:

D/MainActivity: 可以写入
W/System.err: java.io.IOException: open failed: EACCES (Permission denied)
W/System.err: at java.io.File.createNewFile(File.java:941)
W/System.err: at com.xfan.writesdcard.MainActivity$2.onClick(MainActivity.java:54)
W/System.err: at android.view.View.performClick(View.java:4785)
W/System.err: at android.view.View$PerformClick.run(View.java:19869)
W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:155)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5702)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at java.io.File.createNewFile(File.java:934)
W/System.err: ... 11 more

权限也申请了:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Android4.4之后在/SD卡/Android/data/包名/ 的文件夹下可以应该是可以写入数据的呀,大部分设备是没有问题的,有些设备会出现这个问题,google了很长时间了一直不知道怎么解决,而相同的手机优酷视频却可以做到,希望有相关经验的大神指点一下,谢谢了

天蓬老师天蓬老师2767 Il y a quelques jours590

répondre à tous(5)je répondrai

  • PHP中文网

    PHP中文网2017-04-18 09:06:47

    Ce problème est lié à la version du système. J'ai également rencontré des problèmes similaires. Surtout après la version 6.0, le système Android classe l'autorisation WRITE_EXTERNAL_STORAGE comme une autorisation dangereuse, à moins que l'utilisateur ne la demande manuellement, même si elle est appliquée, elle ne peut pas le faire. être transféré sur la carte SD.

    Il est recommandé de procéder comme suit :
    Modifiez le chemin de stockage du fichier en /data/data/package name/cache/ ; pour résoudre ce problème, car ce chemin est un chemin intégré dans le système 6.0. (API > 23), vous pouvez écrire des fichiers dans ce répertoire sans demander d'autorisation.

    Inconvénients : lorsque l'utilisateur désinstalle l'application ou efface manuellement le cache du système, le contenu de ce répertoire sera également effacé.

    répondre
    0
  • 高洛峰

    高洛峰2017-04-18 09:06:47

    Cela devrait être un problème avec le système de téléphonie mobile lui-même. De nombreux fabricants de téléphones mobiles modifient le système de manière aléatoire, ce qui entraîne de nombreux bugs inexplicables. Il est recommandé d'essayer de changer le dossier pour stocker les données.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 09:06:47

    En ce qui concerne la version du système mobile, l'API 23 ou supérieure peut vous obliger à demander manuellement l'autorisation

    répondre
    0
  • 怪我咯

    怪我咯2017-04-18 09:06:47

    Avant d'appeler File#createNewFile(), vous devez d'abord vous assurer que le répertoire existe déjà. S'il n'existe pas, vous devez d'abord File#mkdir() ou. Fichier# mkdirs()

    Portail des autorisations d'application : Interprétation des directives de développement officielles d'Android – Autorisations d'exécution

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 09:06:47

    J'ai fait quelques progrès aujourd'hui. Lorsque mon application ne pouvait pas écrire de fichiers, j'ai désinstallé Youku Video, puis j'ai réinstallé Youku, mais elle n'a toujours pas pu télécharger la vidéo et cela a provoqué une erreur dans la carte SD. et j'ai débranché la carte SD et je l'ai utilisée plus tard. L'application et Youku peuvent être téléchargés, j'en déduis donc que ce problème devrait être un problème avec le système de téléphonie mobile, pas avec mon application.

    répondre
    0
  • Annulerrépondre