一起做陶瓷官方网站,深圳制作网站有几家,运行两个wordpress,做传销一般是不是有网站Samba#xff08;也被称为SMB/CIFS#xff09;是一个用于在局域网内共享文件和打印服务的协议#xff0c;广泛应用于Windows和Linux系统之间的文件共享。
一、展示Samba服务器下的文件 使用如jcifs这样的Java库来在安卓应用中集成SMB/CIFS客户端功能。这个库提供了与SMB/CI…Samba也被称为SMB/CIFS是一个用于在局域网内共享文件和打印服务的协议广泛应用于Windows和Linux系统之间的文件共享。
一、展示Samba服务器下的文件 使用如jcifs这样的Java库来在安卓应用中集成SMB/CIFS客户端功能。这个库提供了与SMB/CIFS服务器进行通信的API允许在安卓应用中直接访问共享文件。 代码实现 :
NtlmPasswordAuthentication auth new NtlmPasswordAuthentication(SambaManager.getDomainName(path), zhanghao, mima);
SmbFile file new SmbFile(smb://172.16.1.94/, auth);
//根路径 smb://172.16.1.94/
//循环遍历即可 二、尝试使用MediaPlayer播放
代码如下
// MediaPlayer.java
String uri smb://172.16.1.73/lyg/newtestsamb/._Stay_With_Me 新郎入场.mp3;
mstarPlayer.setDataSource(context, uri);报错文件解析错误经排查原生的Android MediaPlayer不直接支持通过SMB协议访问和播放文件因为它主要是为本地存储和网络流媒体设计的。
三、转成HTTP流播放
代码如下
public abstract class StreamServer {// // API parts// /*** Override this to customize the server.p* p* (By default, this delegates to serveFile() and allows directory listing.)** param uri Percent-decoded URI without parameters, for example /index.cgi* param method GET, POST etc.* param parms Parsed, percent decoded parameters from URI and, in case of POST, data.* param header Header entries, percent decoded* return HTTP response, see class Response for details*/public abstract Response serve(String uri, String method, Properties header, Properties parms, Properties files);/*** HTTP response.* Return one of these from serve().*/public class Response {/*** Default constructor: response HTTP_OK, data mime null*/public Response() {this.status HTTP_OK;}/*** Basic constructor.*/public Response(String status, String mimeType, StreamSource data) {this.status status;this.mimeType mimeType;this.data data;}/*** Convenience method that makes an InputStream out of* given text.*//*** Adds given line to the header.*/public void addHeader(String name, String value) {header.put(name, value);}/*** HTTP status code after processing, e.g. 200 OK, HTTP_OK*/public String status;/*** MIME type of content, e.g. text/html*/public String mimeType;/*** Data of the response, may be null.*/public StreamSource data;/*** Headers for the HTTP response. Use addHeader()* to add lines.*/public Properties header new Properties();}/*** Some HTTP response status codes*/public static final StringHTTP_OK 200 OK,HTTP_PARTIALCONTENT 206 Partial Content,HTTP_RANGE_NOT_SATISFIABLE 416 Requested Range Not Satisfiable,HTTP_REDIRECT 301 Moved Permanently,HTTP_FORBIDDEN 403 Forbidden,HTTP_NOTFOUND 404 Not Found,HTTP_BADREQUEST 400 Bad Request,HTTP_INTERNALERROR 500 Internal Server Error,HTTP_NOTIMPLEMENTED 501 Not Implemented;/*** Common mime types for dynamic content*/public static final StringMIME_PLAINTEXT text/plain,MIME_HTML text/html,MIME_DEFAULT_BINARY application/octet-stream,MIME_XML text/xml;// // Socket server code// /*** Starts a HTTP server to given port.p* Throws an IOException if the socket is already in use*///private HTTPSession session;public StreamServer(int port, File wwwroot) throws IOException {myTcpPort port;this.myRootDir wwwroot;myServerSocket new ServerSocket(myTcpPort);myThread new Thread(() - {try {while (true) {Socket accept myServerSocket.accept();new HTTPSession(accept);}} catch (IOException ioe) {}});myThread.setDaemon(true);myThread.start();}/*** Stops the server.*/public void stop() {try {myServerSocket.close();myThread.join();} catch (IOException ioe) {} catch (InterruptedException e) {}}/*** Handles one session, i.e. parses the HTTP request* and returns the response.*/private class HTTPSession implements Runnable {private InputStream is;private final Socket socket;public HTTPSession(Socket s) {socket s;//mySocket s;Thread t new Thread(this);t.setDaemon(true);t.start();}public void run() {try {//openInputStream();handleResponse(socket);} finally {if (is ! null) {try {is.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}}private void handleResponse(Socket socket) {try {is socket.getInputStream();if (is null) return;// Read the first 8192 bytes.// The full header should fit in here.// Apaches default header limit is 8KB.int bufsize 8192;byte[] buf new byte[bufsize];int rlen is.read(buf, 0, bufsize);if (rlen 0) return;// Create a BufferedReader for parsing the header.ByteArrayInputStream hbis new ByteArrayInputStream(buf, 0, rlen);BufferedReader hin new BufferedReader(new InputStreamReader(hbis, utf-8));Properties pre new Properties();Properties parms new Properties();Properties header new Properties();Properties files new Properties();// Decode the header into parms and header java propertiesdecodeHeader(hin, pre, parms, header);Log.d(Explorer, pre.toString());Log.d(Explorer, Params: parms.toString());Log.d(Explorer, Header: header.toString());String method pre.getProperty(method);String uri pre.getProperty(uri);long size 0x7FFFFFFFFFFFFFFFl;String contentLength header.getProperty(content-length);if (contentLength ! null) {try {size Integer.parseInt(contentLength);} catch (NumberFormatException ex) {}}// We are looking for the byte separating header from body.// It must be the last byte of the first two sequential new lines.int splitbyte 0;boolean sbfound false;while (splitbyte rlen) {if (buf[splitbyte] \r buf[splitbyte] \n buf[splitbyte] \r buf[splitbyte] \n) {sbfound true;break;}splitbyte;}splitbyte;// Write the part of body already read to ByteArrayOutputStream fByteArrayOutputStream f new ByteArrayOutputStream();if (splitbyte rlen) f.write(buf, splitbyte, rlen - splitbyte);// While Firefox sends on the first read all the data fitting// our buffer, Chrome and Opera sends only the headers even if// there is data for the body. So we do some magic here to find// out whether we have already consumed part of body, if we// have reached the end of the data to be sent or we should// expect the first byte of the body at the next read.if (splitbyte rlen)size - rlen - splitbyte 1;else if (!sbfound || size 0x7FFFFFFFFFFFFFFFl)size 0;// Now read all the body and write it to fbuf new byte[512];while (rlen 0 size 0) {rlen is.read(buf, 0, 512);size - rlen;if (rlen 0)f.write(buf, 0, rlen);}// Get the raw body as a byte []byte[] fbuf f.toByteArray();// Create a BufferedReader for easily reading it as string.ByteArrayInputStream bin new ByteArrayInputStream(fbuf);BufferedReader in new BufferedReader(new InputStreamReader(bin));// If the method is POST, there may be parameters// in data section, too, read it:if (method.equalsIgnoreCase(POST)) {String contentType ;String contentTypeHeader header.getProperty(content-type);StringTokenizer st new StringTokenizer(contentTypeHeader, ; );if (st.hasMoreTokens()) {contentType st.nextToken();}if (contentType.equalsIgnoreCase(multipart/form-data)) {// Handle multipart/form-dataif (!st.hasMoreTokens())sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Content type is multipart/form-data but boundary missing. Usage: GET /example/file.html);String boundaryExp st.nextToken();st new StringTokenizer(boundaryExp, );if (st.countTokens() ! 2)sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Content type is multipart/form-data but boundary syntax error. Usage: GET /example/file.html);st.nextToken();String boundary st.nextToken();decodeMultipartData(boundary, fbuf, in, parms, files);} else {// Handle application/x-www-form-urlencodedString postLine ;char pbuf[] new char[512];int read in.read(pbuf);while (read 0 !postLine.endsWith(\r\n)) {postLine String.valueOf(pbuf, 0, read);read in.read(pbuf);if (Thread.interrupted()) {throw new InterruptedException();}}postLine postLine.trim();decodeParms(postLine, parms);}}// Ok, now do the serve()Response r serve(uri, method, header, parms, files);if (r null)sendError(socket, HTTP_INTERNALERROR, SERVER INTERNAL ERROR: Serve() returned a null response.);elsesendResponse(socket, r.status, r.mimeType, r.header, r.data);in.close();} catch (IOException ioe) {try {sendError(socket, HTTP_INTERNALERROR, SERVER INTERNAL ERROR: IOException: ioe.getMessage());} catch (Throwable t) {}} catch (InterruptedException ie) {// Thrown by sendError, ignore and exit the thread.}}/*** Decodes the sent headers and loads the data into* java Properties key - value pairs**/private void decodeHeader(BufferedReader in, Properties pre, Properties parms, Properties header)throws InterruptedException {try {// Read the request lineString inLine in.readLine();if (inLine null) return;StringTokenizer st new StringTokenizer(inLine);if (!st.hasMoreTokens())sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Syntax error. Usage: GET /example/file.html);String method st.nextToken();pre.put(method, method);if (!st.hasMoreTokens())sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Missing URI. Usage: GET /example/file.html);String uri st.nextToken();// Decode parameters from the URIint qmi uri.indexOf(?);if (qmi 0) {decodeParms(uri.substring(qmi 1), parms);uri decodePercent(uri.substring(0, qmi));} else uri Uri.decode(uri);//decodePercent(uri);if (st.hasMoreTokens()) {String line in.readLine();while (line ! null line.trim().length() 0) {int p line.indexOf(:);if (p 0)header.put(line.substring(0, p).trim().toLowerCase(), line.substring(p 1).trim());line in.readLine();}}pre.put(uri, uri);} catch (IOException ioe) {sendError(socket, HTTP_INTERNALERROR, SERVER INTERNAL ERROR: IOException: ioe.getMessage());}}/*** Decodes the Multipart Body data and put it* into java Properties key - value pairs.**/private void decodeMultipartData(String boundary, byte[] fbuf, BufferedReader in, Properties parms, Properties files)throws InterruptedException {try {int[] bpositions getBoundaryPositions(fbuf, boundary.getBytes());int boundarycount 1;String mpline in.readLine();while (mpline ! null) {if (mpline.indexOf(boundary) -1)sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Content type is multipart/form-data but next chunk does not start with boundary. Usage: GET /example/file.html);boundarycount;Properties item new Properties();mpline in.readLine();while (mpline ! null mpline.trim().length() 0) {int p mpline.indexOf(:);if (p ! -1)item.put(mpline.substring(0, p).trim().toLowerCase(), mpline.substring(p 1).trim());mpline in.readLine();}if (mpline ! null) {String contentDisposition item.getProperty(content-disposition);if (contentDisposition null) {sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Content type is multipart/form-data but no content-disposition info found. Usage: GET /example/file.html);}StringTokenizer st new StringTokenizer(contentDisposition, ; );Properties disposition new Properties();while (st.hasMoreTokens()) {String token st.nextToken();int p token.indexOf();if (p ! -1)disposition.put(token.substring(0, p).trim().toLowerCase(), token.substring(p 1).trim());}String pname disposition.getProperty(name);pname pname.substring(1, pname.length() - 1);String value ;if (item.getProperty(content-type) null) {while (mpline ! null mpline.indexOf(boundary) -1) {mpline in.readLine();if (mpline ! null) {int d mpline.indexOf(boundary);if (d -1)value mpline;elsevalue mpline.substring(0, d - 2);}}} else {if (boundarycount bpositions.length)sendError(socket, HTTP_INTERNALERROR, Error processing request);int offset stripMultipartHeaders(fbuf, bpositions[boundarycount - 2]);String path saveTmpFile(fbuf, offset, bpositions[boundarycount - 1] - offset - 4);files.put(pname, path);value disposition.getProperty(filename);value value.substring(1, value.length() - 1);do {mpline in.readLine();} while (mpline ! null mpline.indexOf(boundary) -1);}parms.put(pname, value);}}} catch (IOException ioe) {sendError(socket, HTTP_INTERNALERROR, SERVER INTERNAL ERROR: IOException: ioe.getMessage());}}/*** Find the byte positions where multipart boundaries start.**/public int[] getBoundaryPositions(byte[] b, byte[] boundary) {int matchcount 0;int matchbyte -1;Vector matchbytes new Vector();for (int i 0; i b.length; i) {if (b[i] boundary[matchcount]) {if (matchcount 0)matchbyte i;matchcount;if (matchcount boundary.length) {matchbytes.addElement(new Integer(matchbyte));matchcount 0;matchbyte -1;}} else {i - matchcount;matchcount 0;matchbyte -1;}}int[] ret new int[matchbytes.size()];for (int i 0; i ret.length; i) {ret[i] ((Integer) matchbytes.elementAt(i)).intValue();}return ret;}/*** Retrieves the content of a sent file and saves it* to a temporary file.* The full path to the saved file is returned.**/private String saveTmpFile(byte[] b, int offset, int len) {String path ;if (len 0) {String tmpdir System.getProperty(java.io.tmpdir);try {File temp File.createTempFile(NanoHTTPD, , new File(tmpdir));OutputStream fstream new FileOutputStream(temp);fstream.write(b, offset, len);fstream.close();path temp.getAbsolutePath();} catch (Exception e) { // Catch exception if anySystem.err.println(Error: e.getMessage());}}return path;}/*** It returns the offset separating multipart file headers* from the files data.**/private int stripMultipartHeaders(byte[] b, int offset) {int i 0;for (i offset; i b.length; i) {if (b[i] \r b[i] \n b[i] \r b[i] \n)break;}return i 1;}/*** Decodes the percent encoding scheme. br/* For example: anexample%20string - an example string*/private String decodePercent(String str) throws InterruptedException {try {StringBuffer sb new StringBuffer();for (int i 0; i str.length(); i) {char c str.charAt(i);switch (c) {case :sb.append( );break;case %:sb.append((char) Integer.parseInt(str.substring(i 1, i 3), 16));i 2;break;default:sb.append(c);break;}}return sb.toString();} catch (Exception e) {sendError(socket, HTTP_BADREQUEST, BAD REQUEST: Bad percent-encoding.);return null;}}/*** Decodes parameters in percent-encoded URI-format* ( e.g. nameJack%20DanielspassSingle%20Malt ) and* adds them to given Properties. NOTE: this doesnt support multiple* identical keys due to the simplicity of Properties -- if you need multiples,* you might want to replace the Properties with a Hashtable of Vectors or such.*/private void decodeParms(String parms, Properties p)throws InterruptedException {if (parms null)return;StringTokenizer st new StringTokenizer(parms, );while (st.hasMoreTokens()) {String e st.nextToken();int sep e.indexOf();if (sep 0)p.put(decodePercent(e.substring(0, sep)).trim(),decodePercent(e.substring(sep 1)));}}/*** Returns an error message as a HTTP response and* throws InterruptedException to stop further request processing.*/private void sendError(Socket socket, String status, String msg) throws InterruptedException {sendResponse(socket, status, MIME_PLAINTEXT, null, null);throw new InterruptedException();}/*** Sends given response to the socket.*/private void sendResponse(Socket socket, String status, String mime, Properties header, StreamSource data) {try {if (status null)throw new Error(sendResponse(): Status cant be null.);OutputStream out socket.getOutputStream();PrintWriter pw new PrintWriter(out);pw.print(HTTP/1.0 status \r\n);if (mime ! null)pw.print(Content-Type: mime \r\n);if (header null || header.getProperty(Date) null)pw.print(Date: gmtFrmt.format(new Date()) \r\n);if (header ! null) {Enumeration e header.keys();while (e.hasMoreElements()) {String key (String) e.nextElement();String value header.getProperty(key);pw.print(key : value \r\n);}}pw.print(\r\n);pw.flush();if (data ! null) {//long pending data.available(); // This is to support partial sends, see serveFile()data.open();byte[] buff new byte[8192];int read 0;while ((read data.read(buff)) 0) {//if(SolidExplorer.LOG)Log.d(Explorer, Read: read , pending: data.available());out.write(buff, 0, read);}}out.flush();out.close();if (data ! null)data.close();} catch (IOException ioe) {// Couldnt write? No can do.try {socket.close();} catch (Throwable t) {}}}//private Socket mySocket;}/*** URL-encodes everything between /-characters.* Encodes spaces as %20 instead of .*/private String encodeUri(String uri) {String newUri ;StringTokenizer st new StringTokenizer(uri, / , true);while (st.hasMoreTokens()) {String tok st.nextToken();if (tok.equals(/))newUri /;else if (tok.equals( ))newUri %20;else {newUri URLEncoder.encode(tok);// For Java 1.4 youll want to use this instead:// try { newUri URLEncoder.encode( tok, UTF-8 ); } catch ( java.io.UnsupportedEncodingException uee ) {}}}return newUri;}private int myTcpPort;private final ServerSocket myServerSocket;private Thread myThread;private File myRootDir;/*** GMT date formatter*/private static java.text.SimpleDateFormat gmtFrmt;static {gmtFrmt new java.text.SimpleDateFormat(E, d MMM yyyy HH:mm:ss GMT, Locale.US);gmtFrmt.setTimeZone(TimeZone.getTimeZone(GMT));}/*** The distribution licence*/private static final String LICENCE Copyright (C) 2001,2005-2011 by Jarno Elonen eloneniki.fi\n and Copyright (C) 2010 by Konstantinos Togias infoktogias.gr\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n \n Redistributions of source code must retain the above copyright notice,\n this list of conditions and the following disclaimer. Redistributions in\n binary form must reproduce the above copyright notice, this list of\n conditions and the following disclaimer in the documentation and/or other\n materials provided with the distribution. The name of the author may not\n be used to endorse or promote products derived from this software without\n specific prior written permission. \n \n THIS SOFTWARE IS PROVIDED BY THE AUTHOR AS IS AND ANY EXPRESS OR\n IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.;
}public class Streamer extends StreamServer {public static final int PORT 7871;public static final String URL http://127.0.0.1: PORT;private SmbFile file;protected ListSmbFile extras; //those can be subtitles// private InputStream stream;// private long length;private static Streamer instance;private static Pattern pattern Pattern.compile(^.*\\.(?i)(mp3|wma|wav|aac|ogg|m4a|flac|mp4|avi|mpg|mpeg|3gp|3gpp|mkv|flv|rmvb)$);// private CBItem source;// private String mime;protected Streamer(int port) throws IOException {super(port, new File(.));}public static Streamer getInstance() {if (instance null)try {instance new Streamer(PORT);} catch (IOException e) {e.printStackTrace();}return instance;}public static boolean isStreamMedia(SmbFile file) {return pattern.matcher(file.getName()).matches();}public void setStreamSrc(SmbFile file, ListSmbFile extraFiles) {this.file file;this.extras extraFiles;}Overridepublic Response serve(String uri, String method, Properties header, Properties parms, Properties files) {Response res null;try {SmbFile sourceFile null;String name getNameFromPath(uri);Log.e(youdianzishuip, file.getName() file.getName());Log.e(youdianzishuip, name name);if (file ! null file.getName().equals(name))sourceFile file;else if (extras ! null) {for (SmbFile i : extras) {if (i ! null i.getName().equals(name)) {sourceFile i;break;}}}if (sourceFile null)res new Response(HTTP_NOTFOUND, MIME_PLAINTEXT, null);else {long startFrom 0;long endAt -1;String range header.getProperty(range);if (range ! null) {if (range.startsWith(bytes)) {range range.substring(bytes.length());int minus range.indexOf(-);try {if (minus 0) {startFrom Long.parseLong(range.substring(0, minus));endAt Long.parseLong(range.substring(minus 1));}} catch (NumberFormatException nfe) {}}}Log.d(Explorer, Request: range from: startFrom , to: endAt);// Change return code and add Content-Range header when skipping// is requested//source.open();final StreamSource source new StreamSource(sourceFile);long fileLen source.length();if (range ! null startFrom 0) {if (startFrom fileLen) {res new Response(HTTP_RANGE_NOT_SATISFIABLE, MIME_PLAINTEXT, null);res.addHeader(Content-Range, bytes 0-0/ fileLen);} else {if (endAt 0)endAt fileLen - 1;long newLen fileLen - startFrom;if (newLen 0)newLen 0;Log.d(Explorer, start startFrom , endAt endAt , newLen newLen);final long dataLen newLen;source.moveTo(startFrom);Log.d(Explorer, Skipped startFrom bytes);res new Response(HTTP_PARTIALCONTENT, source.getMimeType(), source);res.addHeader(Content-length, dataLen);}} else {source.reset();res new Response(HTTP_OK, source.getMimeType(), source);res.addHeader(Content-Length, fileLen);}}} catch (IOException ioe) {ioe.printStackTrace();res new Response(HTTP_FORBIDDEN, MIME_PLAINTEXT, null);}res.addHeader(Accept-Ranges, bytes); // Announce that the file// server accepts partial// content requestesreturn res;}public static String getNameFromPath(String path) {if (path null || path.length() 2)return null;int slash path.lastIndexOf(/);if (slash -1)return path;elsereturn path.substring(slash 1);}}public class StreamSource {protected String mime;protected long fp;protected long len;protected String name;protected SmbFile file;InputStream input;protected int bufferSize;public StreamSource(SmbFile file) throws SmbException {fp 0;len file.length();mime MimeTypeMap.getFileExtensionFromUrl(file.getName());name file.getName();this.file file;bufferSize 1024 * 16;}/*** You may notice a strange name for the smb input stream.* I made some modifications to the original one in the jcifs library for my needs,* but streaming required returning to the original one so I renamed it to old.* However, I needed to specify a buffer size in the constructor. It looks now like this:* p* public SmbFileInputStreamOld( SmbFile file, int readBuffer, int openFlags) throws SmbException, MalformedURLException, UnknownHostException {* this.file file;* this.openFlags SmbFile.O_RDONLY 0xFFFF;* this.access (openFlags 16) 0xFFFF;* if (file.type ! SmbFile.TYPE_NAMED_PIPE) {* file.open( openFlags, access, SmbFile.ATTR_NORMAL, 0 );* this.openFlags ~(SmbFile.O_CREAT | SmbFile.O_TRUNC);* } else {* file.connect0();* }* readSize readBuffer;* fs file.length();* }* p* Setting buffer size by properties didnt work for me so I created this constructor.* In the libs folder there is a library modified by me. If you want to use a stock one, you* have to set somehow the buffer size to be equal with http servers buffer size which is 8192.** throws IOException*/public void open() throws IOException {try {input new SmbFileInputStream(file);if (fp 0)input.skip(fp);} catch (Exception e) {throw new IOException(e);}}public int read(byte[] buff) throws IOException {return read(buff, 0, buff.length);}public int read(byte[] bytes, int start, int offs) throws IOException {int read input.read(bytes, start, offs);fp read;return read;}public long moveTo(long position) throws IOException {fp position;return fp;}public void close() {try {input.close();} catch (IOException e) {e.printStackTrace();}}public String getMimeType() {return mime;}public long length() {return len;}public String getName() {return name;}public long available() {return len - fp;}public void reset() {fp 0;}public SmbFile getFile() {return file;}public int getBufferSize() {return bufferSize;}}使用代码如下 :
//开启指向本地127.0.0.1的服务器
Streamer streamer Streamer.getInstance();
//设置路径NtlmPasswordAuthentication auth new NtlmPasswordAuthentication(SambaManager.getDomainName(path), lig, 123456!);
SmbFile file new SmbFile(smb://172.16.1.73/lig/newtestsamb/jaychou.ogg, auth);
streamer.setStreamSrc(file, null);将http的uri复制给MediaPlayer
Uri uri Uri.parse(Streamer.URL Uri.fromFile(new File(Uri.parse(smb://172.16.1.73/lig/newtestsamb/jaychou.ogg).getPath())).getEncodedPath());
mstarPlayer.setDataSource(context, uri);