无法在Android应用程序中访问外部SD卡

时间:2017-04-27 13:17:45

标签: android file-io java-native-interface android-6.0-marshmallow

我正在尝试在我的Android设备的外部存储(sdcard)中创建一个文件,并在该文件中执行读写操作。但是我无法通过我的应用程序访问SD卡。

我正在使用android marshmallow。

我在我的宣言中给予了许可:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

当我使用Environment.getExternalStorageDirectory()时,它会给我/storage/emulated/0路径,我可以在其中成功读写。

但我想在/storage/6161-3432安装的外部SD卡中执行读写操作。而且我无法进行这样的操作。

我也尝试使用JNI代码,它可以打开文件并在特定路径中执行操作。在这里我也可以访问我的/storage/emulated/0路径,但不能访问我的SD卡路径/storage/6161-3432

那么如何使用我的应用程序访问外部SD卡?

1 个答案:

答案 0 :(得分:1)

使用以下代码,它将为您提供手机中所有可能存储选项的列表: -

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>

int main(int argc, char **argv) {
   int sock;
   struct sockaddr_in dst_sin;
   struct in_addr     haddr;

   if(argc != 2)
      return 1;

   if(inet_aton(argv[1], &haddr) == 0) {
      printf("'%s' is not a valid IP address\n", argv[1]);
      return 1;
   }

   dst_sin.sin_family = AF_INET;
   dst_sin.sin_port   = htons(80);
   dst_sin.sin_addr   = haddr;

   if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
      perror("socket");
      return 1;
   }

   if(connect(sock, (struct sockaddr*)&dst_sin, sizeof(dst_sin)) < 0) {
      perror("connect");
      return 1;
   }

   printf(
      "connected to %s:%d\n",
      inet_ntoa(dst_sin.sin_addr), ntohs(dst_sin.sin_port));

#if 0 // ioctl fails with 'no such device'
   struct ifreq ifr;
   memset(&ifr, 0, sizeof(ifr));

   // get the socket's interface index into ifreq.ifr_ifindex
   if(ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
      perror("SIOCGIFINDEX");
      return 1;
   }

   // get the I/F name for ifreq.ifr_ifindex
   if(ioctl(sock, SIOCGIFNAME, &ifr) < 0) {
      perror("SIOCGIFNAME");
      return 1;
   }

   printf("I/F is on '%s'\n", ifr.ifr_name);

#else // only works on Linux 3.8+
#define IFNAMSZ IFNAMSIZ               // Centos7 bug in if.h??

   char      optval[IFNAMSZ] = {0};
   socklen_t optlen = IFNAMSZ;

   if(getsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &optval, &optlen) < 0) {
      perror("getsockopt");
      return 1;
   }

   if(!optlen) {
      printf("invalid optlen\n");
      return 1;
   }

   printf("I/F is on '%s'\n", optval);

#endif

   close(sock);
   return 0;
}