如何在android中查找通过wifi直接模式传输的文件的文件名?
嗨,我的最终目标是使用android中的wifi direct api在两台设备之间传输文件。一旦设备充当客户端,另一个设备就充当服务器,如wifi direct sdk演示中所示。为此,请使用服务器端口和主机地址从客户端创建套接字。我想传输多个文件。在接收端,在接受客户端套接字连接时,我必须使用从客户端发送的文件的文件名创建文件。但是我从服务器端不知道这个文件名 因此,如何使用此wifi直接传输模式的套接字连接发送多个文件传输的文件名 使用服务器端口和主机地址从客户端创建套接字:如何在android中查找通过wifi直接模式传输的文件的文件名?,android,file-transfer,wifi-direct,Android,File Transfer,Wifi Direct,嗨,我的最终目标是使用android中的wifi direct api在两台设备之间传输文件。一旦设备充当客户端,另一个设备就充当服务器,如wifi direct sdk演示中所示。为此,请使用服务器端口和主机地址从客户端创建套接字。我想传输多个文件。在接收端,在接受客户端套接字连接时,我必须使用从客户端发送的文件的文件名创建文件。但是我从服务器端不知道这个文件名 因此,如何使用此wifi直接传输模式的套接字连接发送多个文件传输的文件名 使用服务器端口和主机地址从客户端创建套接字: fileUr
fileUris = intent.getExtras().getParcelableArrayList(EXTRA_STREAM);
String host = intent.getExtras().getString(
EXTRAS_GROUP_OWNER_ADDRESS);
Socket socket = new Socket();
int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT);
try {
Log.d(WifiDirectActivity.TAG, "Opening client socket - ");
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)),
SOCKET_TIMEOUT);
Log.d(WifiDirectActivity.TAG,
"Client socket - " + socket.isConnected());
OutputStream stream = socket.getOutputStream();
ContentResolver cr = context.getContentResolver();
InputStream is = null;
for (int i = 0; i < fileUris.size(); i++) {
Uri uri = fileUris.get(0);
try {
is = cr.openInputStream(Uri.parse(uri.toString()));
} catch (FileNotFoundException e) {
Log.d(WifiDirectActivity.TAG, e.toString());
}
DeviceDetailFragment.copyFile(is, stream);
Log.d(WifiDirectActivity.TAG, "Client: Data written");
}
ServerSocket serverSocket = new ServerSocket(8988);
Log.d(WifiDirectActivity.TAG, "Server: Socket opened");
Socket client = serverSocket.accept();
Log.d(WifiDirectActivity.TAG,
"Server: connection done with client");
final File f = new File(
Environment.getExternalStorageDirectory() + "/"
+ context.getPackageName() + "/wifip2pshared-"
+ "sample");
File dirs = new File(f.getParent());
if (!dirs.exists())
dirs.mkdirs();
f.createNewFile();
Log.d(WifiDirectActivity.TAG,
"server: copying files " + f.toString());
InputStream inputstream = client.getInputStream();
copyFile(inputstream, new FileOutputStream(f));
serverSocket.close();
在创建文件时,在接收方提供文件名,这真的让人震惊。有没有办法把文件名和它一起发送。
请帮我做这个。提前感谢。您可以创建一个bundle对象,该对象同时嵌入文件名和实际数据。大概是这样的:
public class WiFiDirectBundle extends Serializable {
private String fileName;
private String mimeType;
private Long fileSize;
private byte[] fileContent;
public WiFiDirectBundle() {}
// adds a file to the bundle, given its URI
public void setFile(Uri uri) {
File f = new File(Uri.parse(uri.toString()));
fileName = f.getName();
mimeType = MimeTypeMap.getFileExtensionFromUrl(f.getAbsolutePath());
fileSize = f.length();
FileInputStream fin = new FileInputStream(f);
fileContent = new byte[(int) f.length()];
fin.read(fileContent);
}
// restores the file of the bundle, given its directory (change to whatever
// fits you better)
public String restoreFile(String baseDir) {
File f = new File(baseDir + "/" + fileName);
try {
FileOutputStream fos = new FileOutputStream(f);
if (fileContent != null) {
fos.write(fileContent);
}
fos.close();
return f.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String getFileName() {
return fileName;
}
public String getMimeType() {
return mimeType;
}
public Long getFileSize() {
return fileSize;
}
}
然后,只需使用输入和输出流,就可以来回传递WiFiDirectBundle
的实例。当您收到一个对象时,必须显式地将其强制转换为WiFiDirectBundle
类
我知道这并不优雅,但它确实有效。如果我的方法确实适合您的需要,请将其标记为已接受的答案,以便其他人也可以参考。谢谢