NanoHTTPD How to save uploaded file to sdcard folder - android
How to save uploaded file to sdcard folder , currently it stores to /data/data/cache folder with filename like "NanoHTTPD-some random number".
I am not able to copy it to any folder location in sdcard.
I would like to save the file to a pre-mentioned folder location in sdcard with the same name as the original file name was uploaded from my html page.
I have tried all sort of codes .But file copy fails all the time.
1)Not able to get correct location of temp file.
2)Not getting original filename that the form was posted with
Here is my implementation .
Please help i am stuck.
public class HttpMultimediaServer extends NanoHTTPD {
private static final String TAG = "HttpMultimediaServer";
private FileInputStream fileInputStream;
public HttpMultimediaServer() {
super(12345);
this.setTempFileManagerFactory(new ExampleManagerFactory());
}
#Override
public Response serve(IHTTPSession session) {
Method method = session.getMethod();
String uri = session.getUri();
Log.e("handle", "url>>" + uri);
if (uri.contains(filesOnly)) {
isfilesOnly = true;
uri = "/";
} else
isfilesOnly = false;
uri = uri.replace("%20", " ");
try {
uri=new String (uri.getBytes ("iso-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e2) {
e2.printStackTrace();
}
File filePathServer = new File(uri);
if (method==Method.POST) {
try {
Map<String, String> hdrs=session.getHeaders();
Map<String, String> params=session.getParms();
Map<String, String> files = new HashMap<String, String>();
session.parseBody(files);
Set<String> keys = files.keySet();
for(String key: keys){
String name = key;
String loaction = files.get(key);
File tempfile = new File(loaction);
String tempFileName = files.get(loaction).toString();
File fileToMove = new File(tempFileName);
// temp file path returned by NanoHTTPD
String p =Environment.getExternalStorageDirectory().getPath();
String newFile = p + "/LICENSE.txt";
File nf = new File(newFile); // I want to move file here
if (fileToMove.canWrite()) {
boolean success = fileToMove.renameTo(nf);
if (success == true) {
// LOG to console
Log.i("FILE_MOVED_TO", newFile);
} else {
Log.e("FILE_MOVE_ERROR", tempFileName);
}
} else {
Log.e("PERMISSION_ERROR_TEMP_FILE", tempFileName);
}
}
uploadstatus = UPLOAD_SUCESS;
return new Response("UPLOAD_SUCESS");
} catch (Exception e) {
e.printStackTrace();
uploadstatus = UPLOAD_FAIL;
return new Response("UPLOAD_FAIL");
}
}
}
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
public static void copyFile(File src, File dst) throws IOException
{
FileChannel inChannel = new FileInputStream(src).getChannel();
FileChannel outChannel = new FileOutputStream(dst).getChannel();
try
{
inChannel.transferTo(0, inChannel.size(), outChannel);
}
finally
{
if (inChannel != null)
inChannel.close();
if (outChannel != null)
outChannel.close();
}
}
private Response getFullResponse(String mimeType,String filePath) throws FileNotFoundException {
// cleanupStreams();
fileInputStream = new FileInputStream(filePath);
return new Response(Response.Status.OK, mimeType, fileInputStream);
}
private Response getPartialResponse(String mimeType, String rangeHeader,String filePath) throws IOException {
File file = new File(filePath);
String rangeValue = rangeHeader.trim().substring("bytes=".length());
long fileLength = file.length();
long start, end;
if (rangeValue.startsWith("-")) {
end = fileLength - 1;
start = fileLength - 1
- Long.parseLong(rangeValue.substring("-".length()));
} else {
String[] range = rangeValue.split("-");
start = Long.parseLong(range[0]);
end = range.length > 1 ? Long.parseLong(range[1])
: fileLength - 1;
}
if (end > fileLength - 1) {
end = fileLength - 1;
}
if (start <= end) {
long contentLength = end - start + 1;
// cleanupStreams();
fileInputStream = new FileInputStream(file);
//noinspection ResultOfMethodCallIgnored
fileInputStream.skip(start);
Response response = new Response(Response.Status.PARTIAL_CONTENT, mimeType, fileInputStream);
response.addHeader("Content-Length", contentLength + "");
response.addHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);
response.addHeader("Content-Type", mimeType);
return response;
} else {
return new Response(Response.Status.RANGE_NOT_SATISFIABLE, "text/html", rangeHeader);
}
}
int UPLOAD_SUCESS = 1;
int UPLOAD_FAIL = -1;
int UPLOAD_NO = 0;
int uploadstatus;
boolean isfilesOnly;
String filesOnly = "?filesOnly=1";
ArrayList<CLocalFile> list;
StringBuilder sb;
public void walkdir(File dir) {
File listFile[] = dir.listFiles();
if (listFile != null) {
for (int i = 0; i < listFile.length; i++) {
// checking if it is a directory
if (listFile[i].isDirectory()) {
if (isfilesOnly)
walkdir(listFile[i]);
else {
CLocalFile f = new CLocalFile();
f.setName(listFile[i].getName());
f.setData(listFile[i].getAbsolutePath());
f.setSize("Folder");
list.add(f);
continue;
}
}
// checking the file extension if it is a file
String fileName = listFile[i].getName();
String extension = "";
int e = fileName.lastIndexOf('.');
if (e > 0) {
extension = fileName.substring(e + 1);
}
if (!isfilesOnly
|| CollabUtility.video_pattern.contains(extension
.toLowerCase(Locale.ENGLISH))
|| CollabUtility.document_pattern.contains(extension
.toLowerCase(Locale.ENGLISH))
|| CollabUtility.audio_pattern.contains(extension
.toLowerCase(Locale.ENGLISH))) {
CLocalFile f = new CLocalFile();
f.setName(fileName);
String mb = "Bytes";
double size = listFile[i].length();
if (size > 1024) {
size = size / 1024;
mb = "KB";
}
if (size > 1024) {
size = size / 1024;
mb = "MB";
}
if (size > 1024) {
size = size / 1024;
mb = "GB";
}
size = Math.floor(size * 100 + 0.5) / 100;
f.setSize(size + " " + mb);
f.setData(listFile[i].getAbsolutePath());
list.add(f);
}
}
}
}
void listofMedia(File file) {
list = new ArrayList<CLocalFile>();
walkdir(file);
// now create the html page
String style = "<style>" + "html {background-color:#eeeeee;} "
+ "body { background-color:#FFFFFF; "
+ "font-family:Tahoma,Arial,Helvetica,sans-serif; "
+ "font-size:18x; " + "border:3px " + "groove #006600; "
+ "padding:15px; } " + "</style>";
String script = "<script language='javascript'>"
+ "function clickit(state) {"
+ "if(state==true){document.getElementById('filesonly').checked="
+ "! document.getElementById('filesonly').checked}"
+ "if ( document.getElementById('filesonly').checked == false ){"
+ "var l=window.location.href;" + "l=l.replace('" + filesOnly
+ "', '');" + "window.location=l;" + "}"
+ "else{var l=window.location.href;"
+ "window.location=String.concat(l,'" + filesOnly + "')" + "}"
+ "}</script>";
Log.d("check", script);
sb = new StringBuilder();
sb.append("<html>");
sb.append("<head>");
sb.append("<title>Files from device</title>");
sb.append(style);
// sb.append("<script language='javascript'>"
// + "function clickit() {"
// + "if ( document.getElementById('filesonly').checked == false ){"
// + "var l=window.location.href;" + "l=l.replace('" + filesOnly
// + "', '');" + "window.location=l;" + "}"
// + "else{var l=window.location.href;"
// + "window.location=String.concat(l,'" + filesOnly + "')" + "}"
// + "}</script>");
sb.append(script);
sb.append("</head>");
sb.append("<body alink=\"blue\" vlink=\"blue\">");
Log.d("check", sb.toString());
// if(true)
// return;
// form upload
sb.append("<h3>File Upload:</h3>");
sb.append("Select a file to upload: <br/>");
sb.append("<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">");
sb.append("<input type=\"file\" name=\"uploadfile\" size=\"50\" />");
sb.append("<input type=\"submit\" value=\"Upload File\" />");
sb.append("</form>");
if (uploadstatus == UPLOAD_FAIL)
sb.append("<h3><font color='red'>The upload was failed</font></h3>");
else if (uploadstatus == UPLOAD_SUCESS)
sb.append("<h3><font color='red'>The upload was successfull</font></h3>");
// if files are there or not
if (list != null && list.size() != 0) {
sb.append("<h3>The following files are hosted live from ");
if (!isfilesOnly)
sb.append("<font color='blue'>" + file.getName()
+ "</font> folder of ");
sb.append("the device</h3>");
} else {
sb.append("<h3>Couldn't find any file from <font color='blue'>"
+ file.getName() + "</font> folder of the device</h3>");
}
// checkbox
if (isfilesOnly)
sb.append("<input type=\"checkbox\" onchange='clickit(false);' checked='true' id=\"filesonly\" />"
+ "<asd onclick='clickit(true);' style=\"cursor:default;\">"
+ "Show only relevant Files (Audio, Video and Documents)</asd>");
else
sb.append("<input type=\"checkbox\" onchange='clickit(false);' id=\"filesonly\" />"
+ "<asd onclick='clickit(true);' style=\"cursor:default;\">"
+ "Show only relevant Files (Audio, Video and Documents)</asd>");
// table of files
sb.append("<table cellpadding='5px' align=''>");
// showing path URLs if not only files
if (!isfilesOnly) {
ArrayList<File> href = new ArrayList<File>();
File parent = new File(file.getPath());
while (parent != null) {
href.add(parent);
// pointing to the next parent
parent = parent.getParentFile();
}
sb.append("<tr>");
sb.append("<td colspan=2><b>");
sb.append("<a href='" + file.getParent() + "'>");
sb.append("UP");
sb.append("</a>");
// printing the whole structure
String path = "";
for (int i = href.size() - 2; i >= 0; --i) {
path = href.get(i).getPath();
if (isfilesOnly)
path += filesOnly;
sb.append(" => <a href='" + path + "'>");
sb.append(href.get(i).getName());
sb.append("</a>");
}
sb.append("</b></td>");
sb.append("</tr>");
}
sb.append("<tr>");
sb.append("<td>");
sb.append("<b>File Name</b>");
sb.append("</td>");
sb.append("<td>");
sb.append("<b>Size / Type</b>");
sb.append("</td>");
sb.append("<tr>");
// sorting the list
Collections.sort(list);
// showing the list of files
for (CLocalFile f : list) {
String data = f.getData();
if (isfilesOnly)
data += filesOnly;
sb.append("<tr>");
sb.append("<td>");
sb.append("<a href='" + data + "'>");
sb.append(f.getName());
sb.append("</a>");
sb.append("</td>");
sb.append("<td align=\"right\">");
sb.append(f.getSize());
sb.append("</td>");
sb.append("</tr>");
}
sb.append("</table>");
sb.append("</body>");
sb.append("</html>");
}
private static class ExampleManagerFactory implements TempFileManagerFactory {
#Override
public TempFileManager create() {
return new ExampleManager();
}
}
private static class ExampleManager implements TempFileManager {
private final String tmpdir;
private final List<TempFile> tempFiles;
private ExampleManager() {
tmpdir = System.getProperty("java.io.tmpdir");
// tmpdir = System.getProperty("/sdcard");
tempFiles = new ArrayList<TempFile>();
}
#Override
public TempFile createTempFile() throws Exception {
DefaultTempFile tempFile = new DefaultTempFile(tmpdir);
tempFiles.add(tempFile);
System.out.println("Created tempFile: " + tempFile.getName());
return tempFile;
}
#Override
public void clear() {
if (!tempFiles.isEmpty()) {
System.out.println("Cleaning up:");
}
for (TempFile file : tempFiles) {
try {
System.out.println(" "+file.getName());
file.delete();
} catch (Exception ignored) {}
}
tempFiles.clear();
}
}
}
If you are using NanoHTTPD r.2.1.0, please try these codes:
#Override
public Response serve(IHTTPSession session) {
Map<String, String> headers = session.getHeaders();
Map<String, String> parms = session.getParms();
Method method = session.getMethod();
String uri = session.getUri();
Map<String, String> files = new HashMap<>();
if (Method.POST.equals(method) || Method.PUT.equals(method)) {
try {
session.parseBody(files);
} catch (IOException ioe) {
return getResponse("Internal Error IO Exception: " + ioe.getMessage());
} catch (ResponseException re) {
return new Response(re.getStatus(), MIME_PLAINTEXT, re.getMessage());
}
}
if ("/uploadfile".equalsIgnoreCase(uri)) {
String filename = parms.get("filename");
String tmpFilePath = files.get("filename");
if (null == filename || null == tmpFilePath) {
// Response for invalid parameters
}
File dst = new File(mCurrentDir, filename);
if (dst.exists()) {
// Response for confirm to overwrite
}
File src = new File(tmpFilePath);
try {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
byte[] buf = new byte[65536];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (IOException ioe) {
// Response for failed
}
// Response for success
}
// Others...
}
In order to upload multiple files in a single input file like:
<input type="file" name="filename" multiple>
I modify decodeMultipartData() method in NanoHTTPD.java from:
private void decodeMultipartData(String boundary, ByteBuffer fbuf, BufferedReader in, Map<String, String> parms,
Map<String, String> files) throws ResponseException {
try {
int[] bpositions = getBoundaryPositions(fbuf, boundary.getBytes());
int boundarycount = 1;
String mpline = in.readLine();
while (mpline != null) {
if (!mpline.contains(boundary)) {
throw new ResponseException(Response.Status.BAD_REQUEST, "BAD REQUEST: Content type is multipart/form-data but next chunk does not start with boundary. Usage: GET /example/file.html");
}
boundarycount++;
Map<String, String> item = new HashMap<String, String>();
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(Locale.US), mpline.substring(p + 1).trim());
}
mpline = in.readLine();
}
if (mpline != null) {
String contentDisposition = item.get("content-disposition");
if (contentDisposition == null) {
throw new ResponseException(Response.Status.BAD_REQUEST, "BAD REQUEST: Content type is multipart/form-data but no content-disposition info found. Usage: GET /example/file.html");
}
StringTokenizer st = new StringTokenizer(contentDisposition, ";");
Map<String, String> disposition = new HashMap<String, String>();
while (st.hasMoreTokens()) {
String token = st.nextToken().trim();
int p = token.indexOf('=');
if (p != -1) {
disposition.put(token.substring(0, p).trim().toLowerCase(Locale.US), token.substring(p + 1).trim());
}
}
String pname = disposition.get("name");
pname = pname.substring(1, pname.length() - 1);
String value = "";
if (item.get("content-type") == null) {
while (mpline != null && !mpline.contains(boundary)) {
mpline = in.readLine();
if (mpline != null) {
int d = mpline.indexOf(boundary);
if (d == -1) {
value += mpline;
} else {
value += mpline.substring(0, d - 2);
}
}
}
} else {
if (boundarycount > bpositions.length) {
throw new ResponseException(Response.Status.INTERNAL_ERROR, "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.get("filename");
value = value.substring(1, value.length() - 1);
do {
mpline = in.readLine();
} while (mpline != null && !mpline.contains(boundary));
}
parms.put(pname, value);
}
}
} catch (IOException ioe) {
throw new ResponseException(Response.Status.INTERNAL_ERROR, "SERVER INTERNAL ERROR: IOException: " + ioe.getMessage(), ioe);
}
}
tobe:
private void decodeMultipartData(String boundary, ByteBuffer fbuf, BufferedReader in, Map<String, String> parms,
Map<String, String> files) throws ResponseException {
try {
String pname_0 = "";
String pname_1 = "";
int pcount = 1;
int[] bpositions = getBoundaryPositions(fbuf, boundary.getBytes());
int boundarycount = 1;
String mpline = in.readLine();
while (mpline != null) {
if (!mpline.contains(boundary)) {
throw new ResponseException(Response.Status.BAD_REQUEST, "BAD REQUEST: Content type is multipart/form-data but next chunk does not start with boundary. Usage: GET /example/file.html");
}
boundarycount++;
Map<String, String> item = new HashMap<String, String>();
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(Locale.US), mpline.substring(p + 1).trim());
}
mpline = in.readLine();
}
if (mpline != null) {
String contentDisposition = item.get("content-disposition");
if (contentDisposition == null) {
throw new ResponseException(Response.Status.BAD_REQUEST, "BAD REQUEST: Content type is multipart/form-data but no content-disposition info found. Usage: GET /example/file.html");
}
StringTokenizer st = new StringTokenizer(contentDisposition, ";");
Map<String, String> disposition = new HashMap<String, String>();
while (st.hasMoreTokens()) {
String token = st.nextToken().trim();
int p = token.indexOf('=');
if (p != -1) {
disposition.put(token.substring(0, p).trim().toLowerCase(Locale.US), token.substring(p + 1).trim());
}
}
String pname = disposition.get("name");
pname = pname.substring(1, pname.length() - 1);
if (pname.contentEquals(pname_0)) {
pname_1 = pname + String.valueOf(pcount);
pcount++;
} else {
pname_0 = pname;
pname_1 = pname;
}
String value = "";
if (item.get("content-type") == null) {
while (mpline != null && !mpline.contains(boundary)) {
mpline = in.readLine();
if (mpline != null) {
int d = mpline.indexOf(boundary);
if (d == -1) {
value += mpline;
} else {
value += mpline.substring(0, d - 2);
}
}
}
} else {
if (boundarycount > bpositions.length) {
throw new ResponseException(Response.Status.INTERNAL_ERROR, "Error processing request");
}
int offset = stripMultipartHeaders(fbuf, bpositions[boundarycount - 2]);
String path = saveTmpFile(fbuf, offset, bpositions[boundarycount - 1] - offset - 4);
files.put(pname_1, path);
value = disposition.get("filename");
value = value.substring(1, value.length() - 1);
do {
mpline = in.readLine();
} while (mpline != null && !mpline.contains(boundary));
}
parms.put(pname_1, value);
}
}
} catch (IOException ioe) {
throw new ResponseException(Response.Status.INTERNAL_ERROR, "SERVER INTERNAL ERROR: IOException: " + ioe.getMessage(), ioe);
}
}
Hope this help and sorry for my bad English..:-)
Here's my working code:
public Response serve(IHTTPSession session) {
Map<String, String> headers = session.getHeaders();
Map<String, String> parms = session.getParms();
Method method = session.getMethod();
String uri = session.getUri();
Map<String, String> files = new HashMap<>();
if (Method.POST.equals(method) || Method.PUT.equals(method)) {
try {
session.parseBody(files);
} catch (IOException ioe) {
return getResponse("Internal Error IO Exception: " + ioe.getMessage());
} catch (ResponseException re) {
return new Response(re.getStatus(), MIME_PLAINTEXT, re.getMessage());
}
}
uri = uri.trim().replace(File.separatorChar, '/');
if (uri.indexOf('?') >= 0) {
uri = uri.substring(0, uri.indexOf('?'));
}
// Other implementation goes here...
if ("/uploadfiles".equalsIgnoreCase(uri)) {
String filename, tmpFilePath;
File src, dst;
for (Map.Entry entry : parms.entrySet()) {
if (entry.getKey().toString().substring(0, 8).equalsIgnoreCase("filename")) {
filename = entry.getValue().toString();
tmpFilePath = files.get(entry.getKey().toString());
dst = new File(mCurrentDir, filename);
if (dst.exists()) {
return getResponse("Internal Error: File already exist");
}
src = new File(tmpFilePath);
if (! copyFile(src, dst)) {
return getResponse("Internal Error: Uploading failed");
}
}
}
return getResponse("Success");
}
return getResponse("Error 404: File not found");
}
private boolean deleteFile(File target) {
if (target.isDirectory()) {
for (File child : target.listFiles()) {
if (! deleteFile(child)) {
return false;
}
}
}
return target.delete();
}
private boolean copyFile(File source, File target) {
if (source.isDirectory()) {
if (! target.exists()) {
if (! target.mkdir()) {
return false;
}
}
String[] children = source.list();
for (int i = 0; i < source.listFiles().length; i++) {
if (! copyFile(new File(source, children[i]), new File(target, children[i]))) {
return false;
}
}
} else {
try {
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(target);
byte[] buf = new byte[65536];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (IOException ioe) {
return false;
}
}
return true;
}
private Response getResponse(String message) {
return createResponse(Response.Status.OK, MIME_PLAINTEXT, message);
}
// Announce that the file server accepts partial content requests
private Response createResponse(Response.Status status, String mimeType, String message) {
Response res = new Response(status, mimeType, message);
res.addHeader("Accept-Ranges", "bytes");
return res;
}
To allow multiple file upload:
<input type="file" name="filename" multiple>
The same issue existed in the 2.2.1 branch. Following the same logic, I fixed the same function with a few lines of code change.
Add a counter pcount at the beginning of the function:
private void decodeMultipartFormData(String boundary, String encoding, ByteBuffer fbuf, Map<String, String> parms, Map<String, String> files) throws ResponseException {
int pcount = 1;
try {
Then use the counter to update the keyname if filename is not empty:
while (matcher.find()) {
String key = matcher.group(1);
if ("name".equalsIgnoreCase(key)) {
part_name = matcher.group(2);
} else if ("filename".equalsIgnoreCase(key)) {
file_name = matcher.group(2);
// add these two line to support multiple
// files uploaded using the same field Id
if (!file_name.isEmpty()) {
if (pcount > 0)
part_name = part_name + String.valueOf(pcount++);
else
pcount++;
}
}
}
Maybe late, but just for latecommers just like me.
Explained before, the client use okhttp upload a file just like the follow code:
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
//sourceFile is a File as you know
.addFormDataPart("image_file_1", "logo-square1.png", RequestBody.create(MediaType.parse("image/png"), sourceFile))
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
The follow code is what you want
#Override
public Response serve(IHTTPSession session) {
Method method = session.getMethod();
// ▼ 1、parse post body ▼
Map<String, String> files = new HashMap<>();
if (Method.POST.equals(method) || Method.PUT.equals(method)) {
try {
session.parseBody(files);
} catch (IOException ioe) {
return getResponse("Internal Error IO Exception: " + ioe.getMessage());
} catch (ResponseException re) {
return newFixedLengthResponse(re.getStatus(), MIME_PLAINTEXT, re.getMessage());
}
}
//after the body parsed, by default nanoHTTPD will save the file to cache and put it into params( "image_file_1" as key and the value is "logo-square1.png");
//files key is just like "image_file_1", and the value is nanoHTTPD's template file path in cache
// ▲ 1、parse post body ▲
// ▼ 2、copy file to target path xiaoyee ▼
Map<String, String> params = session.getParms();
for (Map.Entry<String, String> entry : params.entrySet()) {
final String paramsKey = entry.getKey();
if (paramsKey.contains("image_file_1")) {
final String tmpFilePath = files.get(paramsKey);
final String fileName = paramsKey;
final File tmpFile = new File(tmpFilePath);
final File targetFile = new File(mCurrentDir + fileName);
LogUtil.log("copy file now, source file path: %s,target file path:%s", tmpFile.getAbsoluteFile(), targetFile.getAbsoluteFile());
//a copy file method just what you like
copyFile(tmpFile, targetFile);
//maybe you should put the follow code out
return getResponse("Success");
}
}
// ▲ 2、copy file to target path xiaoyee ▲
return getResponse("Error 404: File not found");
}
Related
Asynctask fast on virtual device, slow on real device
I am using a service to download files and extract them if they are archived. The extraction method is wrapped as a asynctask to improve performance of the extraction process. My problem is that when I run the app on the virtual device, all is fine and the extraction process is really fast but as soon as I test it on a real device (Nexus 9 tablet, Android 6x) the extraction process is really slow and takes minutes to complete. Is there anything I can do, to speed up the extraction process? I execute the asynctask with: new UnRarTask(targetAppName).execute(); Below the piece of code which is relevant: public class DownloadTask implements Runnable { private DownloadService service; private DownloadManager downloadManager; protected void init(DownloadService service, Intent intent) { this.service = service; downloadManager = (DownloadManager) MyApp_.getInstance(). getSystemService(Activity.DOWNLOAD_SERVICE); DownloadRequest downloadRequest = intent.getParcelableExtra(DownloadService .DOWNLOAD_REQUEST); } private class UnRarTask extends AsyncTask<Void, Integer, String> { String rarPath = null; int countRar = 0; long copiedbytes = 0, totalbytes = 0; Archive archive = null; FileHeader fileHeader = null; File archiveFile; List<FileHeader> headers; UnRarTask(String one) { this.archiveFile = new File(one); } #Override protected String doInBackground(Void... params) { try { archive = new Archive(new FileVolumeManager(archiveFile)); } catch (RarException | IOException e) { e.printStackTrace(); } String fileName = archiveFile.getName(); String absolutePath = archiveFile.getAbsolutePath(); String archiveDirectoryFileName = absolutePath.substring(0, absolutePath.indexOf(fileName)); if (archive != null) { fileHeader = archive.nextFileHeader(); headers = archive.getFileHeaders(); for (FileHeader fh : headers) { totalbytes = totalbytes + fh.getFullUnpackSize(); } } while (fileHeader != null) { BufferedInputStream inputStream; try { inputStream = new BufferedInputStream(archive.getInputStream(fileHeader)); String extractedFileName = fileHeader.getFileNameString().trim(); String fullExtractedFileName = archiveDirectoryFileName + extractedFileName; File extractedFile = new File(fullExtractedFileName); FileOutputStream fileOutputStream = new FileOutputStream(extractedFile); BufferedOutputStream flout = new BufferedOutputStream(fileOutputStream, BUFFER_SIZE); if (extractedFile.getName().toLowerCase().endsWith(".mp3") || extractedFile.getName().toLowerCase().endsWith(".epub") || extractedFile.getName().toLowerCase().endsWith(".pdf") || extractedFile.getName().toLowerCase().endsWith(".mobi") || extractedFile.getName().toLowerCase().endsWith(".azw3") || extractedFile.getName().toLowerCase().endsWith(".m4b") || extractedFile.getName().toLowerCase().endsWith(".apk")) { rarPath = extractedFile.getPath(); countRar++; } int len; byte buf[] = new byte[BUFFER_SIZE]; while ((len = inputStream.read(buf)) > 0) { //fileOutputStream.write(buf, 0, len); copiedbytes = copiedbytes + len; int progress = (int) ((copiedbytes / (float) totalbytes) * 100); if (progress > lastProgress) { lastProgress = progress; service.showUpdateProgressNotification(downloadId, appName, progress, "Extracting rar archive: " + lastProgress + " % completed", downloadStart); } } archive.extractFile(fileHeader, flout); flout.flush(); flout.close(); fileOutputStream.flush(); fileOutputStream.close(); inputStream.close(); fileHeader = archive.nextFileHeader(); } catch (RarException | IOException e) { e.printStackTrace(); } } if (countRar == 0) { filePath = "Error"; broadcastFailed(); } if (copiedbytes == totalbytes) { if (archive != null) archive.close(); } return null; } } }
how to upload a video to YouTube using my android app
How to upload a video to a particular YouTube account from my android app i have followed https://github.com/youtube/yt-direct-lite-android but its not very documented. I have tried public class YoutubeUploader { private static final String TAG = "YoutubeUploader"; // After creating project at http://www.appspot.com DEFAULT_YTD_DOMAIN == <Developers Console Project ID>.appspot.com [ You can find from Project -> Administration -> Application settings] //public static final String DEFAULT_YTD_DOMAIN = "developerconsolid.appspot.com"; // I used Google APIs Console Project Title as Domain name: //public static final String DEFAULT_YTD_DOMAIN_NAME = "Domain Name"; //From Google Developer Console from same project (Created by SHA1; project package) //Example https://console.developers.google.com/project/apps~gtl-android-youtube-test/apiui/credential public static final String DEVELOPER_KEY = "<MY_DEVELOPER_KEY>"; // CLIENT_ID == Google APIs Console Project Number: public static final String CLIENT_ID = "157613"; public static final String YOUTUBE_AUTH_TOKEN_TYPE = "youtube"; private static final String AUTH_URL = "https://www.google.com/accounts/ClientLogin"; // Uploader's user-name and password private static final String USER_NAME = "my#gmail.com"; private static final String PASSWORD = "mypassword"; private static final String INITIAL_UPLOAD_URL = "https://uploads.gdata.youtube.com/resumable/feeds/api/users/default/uploads"; private static String getClientAuthToken() { try { URL url = new URL(AUTH_URL); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); String template = "Email=%s&Passwd=%s&service=%s&source=%s"; String userName = USER_NAME; // TODO String password = PASSWORD; // TODO String service = YOUTUBE_AUTH_TOKEN_TYPE; String source = CLIENT_ID; userName = URLEncoder.encode(userName, "UTF-8"); password = URLEncoder.encode(password, "UTF-8"); String loginData = String.format(template, userName, password, service, source); OutputStreamWriter outStreamWriter = new OutputStreamWriter(urlConnection.getOutputStream()); outStreamWriter.write(loginData); outStreamWriter.close(); int responseCode = urlConnection.getResponseCode(); if (responseCode != 200) { Log.d(TAG, "Got an error response : " + responseCode + " " + urlConnection.getResponseMessage()); throw new IOException(urlConnection.getResponseMessage()); } else { InputStream is = urlConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { if (line.startsWith("Auth=")) { String split[] = line.split("="); String token = split[1]; Log.d(TAG, "Auth Token : " + token); return token; } } } } catch (Exception e) { e.printStackTrace(); } return null; } public static String upload(YoutubeUploadRequest uploadRequest, ProgressListner listner, Activity activity) { totalBytesUploaded = 0; String authToken = getClientAuthToken(); if(authToken != null) { String uploadUrl = uploadMetaData(uploadRequest, authToken, activity, true); File file = getFileFromUri(uploadRequest.getUri(), activity); long currentFileSize = file.length(); int uploadChunk = 1024 * 1024 * 3; // 3MB int start = 0; int end = -1; String videoId = null; double fileSize = currentFileSize; while (fileSize > 0) { if (fileSize - uploadChunk > 0) { end = start + uploadChunk - 1; } else { end = start + (int) fileSize - 1; } Log.d(TAG, String.format("start=%s end=%s total=%s", start, end, file.length())); try { videoId = gdataUpload(file, uploadUrl, start, end, authToken, listner); fileSize -= uploadChunk; start = end + 1; } catch (IOException e) { Log.d(TAG,"Error during upload : " + e.getMessage()); } } if (videoId != null) { return videoId; } } return null; } public static int totalBytesUploaded = 0; #SuppressLint("DefaultLocale") #SuppressWarnings("resource") private static String gdataUpload(File file, String uploadUrl, int start, int end, String clientLoginToken, ProgressListner listner) throws IOException { int chunk = end - start + 1; int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; FileInputStream fileStream = new FileInputStream(file); URL url = new URL(uploadUrl); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestProperty("Authorization", String.format("GoogleLogin auth=\"%s\"", clientLoginToken)); urlConnection.setRequestProperty("GData-Version", "2"); urlConnection.setRequestProperty("X-GData-Client", CLIENT_ID); urlConnection.setRequestProperty("X-GData-Key", String.format("key=%s", DEVELOPER_KEY)); // some mobile proxies do not support PUT, using X-HTTP-Method-Override to get around this problem urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("X-HTTP-Method-Override", "PUT"); urlConnection.setDoOutput(true); urlConnection.setFixedLengthStreamingMode(chunk); urlConnection.setRequestProperty("Content-Type", "video/3gpp"); urlConnection.setRequestProperty("Content-Range", String.format("bytes %d-%d/%d", start, end, file.length())); Log.d(TAG, urlConnection.getRequestProperty("Content-Range")); OutputStream outStreamWriter = urlConnection.getOutputStream(); fileStream.skip(start); double currentFileSize = file.length(); int bytesRead; int totalRead = 0; while ((bytesRead = fileStream.read(buffer, 0, bufferSize)) != -1) { outStreamWriter.write(buffer, 0, bytesRead); totalRead += bytesRead; totalBytesUploaded += bytesRead; double percent = (totalBytesUploaded / currentFileSize) * 100; if(listner != null){ listner.onUploadProgressUpdate((int) percent); } System.out.println("GTL You tube upload progress: " + percent + "%"); /* Log.d(LOG_TAG, String.format( "fileSize=%f totalBytesUploaded=%f percent=%f", currentFileSize, totalBytesUploaded, percent)); */ //dialog.setProgress((int) percent); // TODO My settings if (totalRead == (end - start + 1)) { break; } } outStreamWriter.close(); int responseCode = urlConnection.getResponseCode(); Log.d(TAG, "responseCode=" + responseCode); Log.d(TAG, "responseMessage=" + urlConnection.getResponseMessage()); try { if (responseCode == 201) { String videoId = parseVideoId(urlConnection.getInputStream()); return videoId; } else if (responseCode == 200) { Set<String> keySet = urlConnection.getHeaderFields().keySet(); String keys = urlConnection.getHeaderFields().keySet().toString(); Log.d(TAG, String.format("Headers keys %s.", keys)); for (String key : keySet) { Log.d(TAG, String.format("Header key %s value %s.", key, urlConnection.getHeaderField(key))); } Log.w(TAG, "Received 200 response during resumable uploading"); throw new IOException(String.format("Unexpected response code : responseCode=%d responseMessage=%s", responseCode, urlConnection.getResponseMessage())); } else { if ((responseCode + "").startsWith("5")) { String error = String.format("responseCode=%d responseMessage=%s", responseCode, urlConnection.getResponseMessage()); Log.w(TAG, error); // TODO - this exception will trigger retry mechanism to kick in // TODO - even though it should not, consider introducing a new type so // TODO - resume does not kick in upon 5xx throw new IOException(error); } else if (responseCode == 308) { // OK, the chunk completed succesfully Log.d(TAG, String.format("responseCode=%d responseMessage=%s", responseCode, urlConnection.getResponseMessage())); } else { // TODO - this case is not handled properly yet Log.w(TAG, String.format("Unexpected return code : %d %s while uploading :%s", responseCode, urlConnection.getResponseMessage(), uploadUrl)); } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } return null; } private static String parseVideoId(InputStream atomDataStream) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(atomDataStream); NodeList nodes = doc.getElementsByTagNameNS("*", "*"); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); String nodeName = node.getNodeName(); if (nodeName != null && nodeName.equals("yt:videoid")) { return node.getFirstChild().getNodeValue(); } } return null; } private static File getFileFromUri(Uri uri, Activity activity) { try { String filePath = null; String[] proj = { Video.VideoColumns.DATA }; Cursor cursor = activity.getContentResolver().query(uri, proj, null, null, null); if(cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(Video.VideoColumns.DATA); filePath = cursor.getString(column_index); } cursor.close(); //String filePath = cursor.getString(cursor.getColumnIndex(Video.VideoColumns.DATA)); File file = new File(filePath); cursor.close(); return file; } catch (Exception e) { e.printStackTrace(); } return null; } private static String uploadMetaData(YoutubeUploadRequest uploadRequest, String clientLoginToken, Activity activity, boolean retry) { try { File file = getFileFromUri(uploadRequest.getUri(), activity); if(file != null) { String uploadUrl = INITIAL_UPLOAD_URL; URL url = new URL(uploadUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Authorization", String.format("GoogleLogin auth=\"%s\"", clientLoginToken)); connection.setRequestProperty("GData-Version", "2"); connection.setRequestProperty("X-GData-Client", CLIENT_ID); connection.setRequestProperty("X-GData-Key", String.format("key=%s", DEVELOPER_KEY)); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/atom+xml"); connection.setRequestProperty("Slug", file.getAbsolutePath()); String title = uploadRequest.getTitle(); String description = uploadRequest.getDescription(); String category = uploadRequest.getCategory(); String tags = uploadRequest.getTags(); String template = readFile(activity, R.raw.gdata).toString(); String atomData = String.format(template, title, description, category, tags); /*String template = readFile(activity, R.raw.gdata_geo).toString(); atomData = String.format(template, title, description, category, tags, videoLocation.getLatitude(), videoLocation.getLongitude());*/ OutputStreamWriter outStreamWriter = new OutputStreamWriter(connection.getOutputStream()); outStreamWriter.write(atomData); outStreamWriter.close(); int responseCode = connection.getResponseCode(); if (responseCode < 200 || responseCode >= 300) { // The response code is 40X if ((responseCode + "").startsWith("4") && retry) { Log.d(TAG, "retrying to fetch auth token for "); clientLoginToken = getClientAuthToken(); // Try again with fresh token return uploadMetaData(uploadRequest, clientLoginToken, activity, false); } else { return null; } } return connection.getHeaderField("Location"); } } catch (Exception e) { e.printStackTrace(); } return null; } public static CharSequence readFile(Activity activity, int id) { BufferedReader in = null; try { in = new BufferedReader(new InputStreamReader(activity.getResources().openRawResource(id))); String line; StringBuilder buffer = new StringBuilder(); while ((line = in.readLine()) != null) { buffer.append(line).append('\n'); } // Chomp the last newline buffer.deleteCharAt(buffer.length() - 1); return buffer; } catch (IOException e) { return ""; } finally { closeStream(in); } } /** * Closes the specified stream. * * #param stream The stream to close. */ private static void closeStream(Closeable stream) { if (stream != null) { try { stream.close(); } catch (IOException e) { // Ignore } } } public static interface ProgressListner { void onUploadProgressUpdate(int progress); } I am getting 404 error in getClientAuthToken() method.I think "https://www.google.com/accounts/ClientLogin";deprecated by google any alternative to this
How to upload cordova filetransfer using server asp.net
i am creating an api that will recieve file from cordova file tranfer plugin.But while uploading , we are getting error "[10/19/2016 5:03:33 PM] azad singh: E/FileTransfer: {"target":"http://54.252.109.57:1031/api/Client/SaveDocument","http_status":500,"body":"\"Object reference not set to an instance of an object.\"","code":1, [10/19/2016 5:03:45 PM] azad singh: Cordova - Camera" [HttpPost] [Route("Uploadfile")] public string Uploadfile() { string msg = ""; try { HttpPostedFile file = HttpContext.Current.Request.Files["file"]; string saveFile = file.FileName; //code to save the file msg = "File uploaded"; } catch (Exception ex) { msg = "Could not upload file: " + ex.Message; } return msg; } Please tell me where I am missing in my code...
This code works for me... [HttpPost] [Route("Uploadfile")] public UploadFile Uploadfile() { HttpPostedFile file = HttpContext.Current.Request.Files["file"]; UploadFile uploadedfile = new UploadFile(); //HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Accepted); try { if (file == null) return uploadedfile ; //response = Request.CreateResponse(HttpStatusCode.NotFound, ""); int count; int sum = 0; byte[] buffer = new byte[file.ContentLength]; int length = (int)file.InputStream.Length; buffer = new byte[length]; while ((count = file.InputStream.Read(buffer, sum, length - sum)) > 0) sum += count; FileVM fileObj = new FileVM(); NameValueCollection parameters = HttpContext.Current.Request.Params; if (parameters.Keys.Count > 0) { fileObj.fileId = ""; fileObj.fileName = file.FileName.ToString(); fileObj.fileType = file.ContentType; fileObj.filedata = ""; fileObj.LastDownLoad = parameters.GetValues("LastDownLoad")[0]; ServicecltClients srv = new ServicecltClients(); uploadedfile.FileId = srv.InsertDocumentAndRelatedClient(fileObj, buffer); uploadedfile.FileType = fileObj.fileType; //response = Request.CreateResponse<UploadFile>(HttpStatusCode.OK, uploadedfile); } } catch (Exception _ex) { //response = Request.CreateResponse(HttpStatusCode.InternalServerError, _ex.Message); ErrorLog.TraceErrorLog(_ex); } finally { file.InputStream.Close(); } return uploadedfile; }
how to recursively copySDcard directory and subdirectory to other smb directory(samba)?
i am using Jcifs library. i try this code is working copy parent directory and file but sub directory not copy.. calling function for (int j = 0; j < AppConst.checkfilelist.size(); j++) { String old = AppConst.checkfilelist.get(j); Log.d("smb_c_check_item", "" + AppConst.checkfilelist.get(j)); copyToDirectory(old, AppConst.destinationpath); } Function public int copyToDirectory(String old, String newDir) { try { SmbFile old_file = new SmbFile(old); SmbFile temp_dir = new SmbFile(newDir); Log.d("smb_c_sour:desti_dir", "" + old + "---" + newDir); // copy file if (old_file.isFile()) { Log.d("smb_c_file","yes"); String file_name = old.substring(old.lastIndexOf("/"), old.length()); Log.d("smb_c_file_name", "" + file_name); String servername="smb://+ ipaddress+/"; NtlmPasswordAuthentication auth1 = new NtlmPasswordAuthentication(servername, "", ""); // smb file path SmbFile cp_smbfile = new SmbFile(newDir + file_name.substring(1),auth1); Log.d(" smb_c_file_path", "" + cp_smbfile); if (!cp_smbfile.exists()) cp_smbfile.createNewFile(); cp_smbfile.connect(); InputStream in = new FileInputStream(String.valueOf((old_file))); SmbFileOutputStream sfos = new SmbFileOutputStream(cp_smbfile); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { sfos.write(buf, 0, len); } // copy directory } else if (old_file.isDirectory()) { String servername="smb://+ ipaddress+/"; NtlmPasswordAuthentication auth1 = new NtlmPasswordAuthentication(servername, "", ""); Log.d("smb_c_folder","yes"); String files[] = old_file.list(); int len = files.length; Log.d("smb_c_dirlength", "" + len); for(int i1=0;i1<len;i1++){ Log.d("smb_c_dir---",""+files[i1]); } // remove last character old = old.substring(0, old.length() - 1); // get dir name String old_f = old.substring(old.lastIndexOf("/"), old.length()); Log.d("smb_c_old_f", "" + old_f); //create smbfile path SmbFile smbdir = new SmbFile(newDir + old_f.substring(1),auth1); // create new directory if (!smbdir.exists()) { Log.d("smb_c_mkdir", "created"); smbdir.mkdirs(); //return -1; } Log.d("smb_c_dir", "" + smbdir); for (int i = 0; i < len; i++) { copyToDirectory(old + "/" + files[i], smbdir + "/"); Log.d("smb_copy_rec", "" + old + "/" + files[i] + ":" + smbdir + "/"); } } else if (!temp_dir.canWrite()) Log.d("smb_c_dir_noperm","yes"); return -1; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return 0; } Thanx in advance for any suggestions or help.sorry for my bad eng..
i found solution.. public int copySdToSmb(String old, String newDir) { try { File copyfile = new File(old); SmbFile temp_dir = new SmbFile(newDir); if (copyfile.isFile()) { SmbFile cp_smbfile = new SmbFile(newDir + copyfile.getName()); if (!cp_smbfile.exists()) cp_smbfile.createNewFile(); cp_smbfile.connect(); InputStream in = new FileInputStream(copyfile); SmbFileOutputStream sfos = new SmbFileOutputStream(cp_smbfile); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { sfos.write(buf, 0, len); } in.close(); sfos.close(); } else if (copyfile.isDirectory()) { String files[] = copyfile.list(); // get dir name String old_f = old.substring(old.lastIndexOf("/"), old.length()); int len = files.length; SmbFile smbdir = new SmbFile(newDir + old_f.substring(1)); // create new directory if (!smbdir.exists()) { smbdir.mkdirs(); //return -1; } for (int i = 0; i <= len; i++) { copySdToSmb(old + "/" + files[i], smbdir + "/"); } } else if (!temp_dir.canWrite()) { return -1; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (Exception e) { } return 0; }
Read HTML file from assets
I have an html file in assets, aaa.html. I want to read the contents of html file and replace it from another string. Is this way is right or is there any other option. my code: File f = new File("file:///android_asset/aaa.html"); FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); But its giving file not found, where as loading in web view loads the file.
InputStream is = getAssets().open("aaa.html"); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); String str = new String(buffer); str = str.replace("old string", "new string");
If you want to load file in webview then use this mWebView.loadUrl("file:///android_asset/myfile.html"); you want to replace content inside Html file tags so the solution class code is here.. public class CardDetail { public static String newHtmlString = ""; // private Context context; #SuppressWarnings("rawtypes") public String getNewHtmlString(String htmlString, HashMap hm) { try { StringTokenizer st = new StringTokenizer(htmlString, "##"); CardDetail.newHtmlString = ""; while (st.hasMoreTokens()) { String token = st.nextToken(); CardDetail.newHtmlString += token; if (st.hasMoreTokens()) { String token2 = st.nextToken(); if (token2.equals("NAME") || token2.equals("POSITION") || token2.equals("COMPANY") || token2.equals("PHOTOURL")) CardDetail.newHtmlString += hm.get(token2); if (token2.equals("SKYPE_CONTAINER1") || token2.equals("TWITTER_CONTAINER1") || token2.equals("PHONENUMBER_CONTAINER1") || token2.equals("EMAIL_CONTAINER1") || token2.equals("ADDRESS_CONTAINER1")) { String replaceString = st.nextToken(); String tokenMiddle = (String) hm.get(st.nextToken()); if (!tokenMiddle.equals("")) { replaceString += tokenMiddle; CardDetail.newHtmlString += replaceString + st.nextToken(); st.nextElement(); } else { st.nextElement(); st.nextElement(); } } } } // Log.i("convertedHTMLString", newHtmlString); return CardDetail.newHtmlString; // htmlString = "<img src='" + hm.get("PHOTOURL") + "' width=80 height=80>"; // return htmlString; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } #SuppressWarnings("unchecked") public HashMap<?, ?> getProfileHashMap(JSONObject jsonObject) { #SuppressWarnings("rawtypes") HashMap hm = new HashMap(); jsonObject = (new JSONConverterClass()).convertJsonObjectToCardDetail(jsonObject); try { hm.put("EMAIL", jsonObject.getString("email")); hm.put("NAME", jsonObject.getString("firstname") + " " + jsonObject.getString("lastname")); hm.put("COMPANY", jsonObject.getString("company_name")); hm.put("POSITION", jsonObject.getString("position")); hm.put("WEBSITE", jsonObject.getString("website")); hm.put("PHONENUMBER", jsonObject.getString("phonenumber")); hm.put("PHOTOURL", jsonObject.getString("picture_url")); hm.put("SKYPE", jsonObject.getString("skype_username")); hm.put("TWITTER", jsonObject.getString("twitter_username")); hm.put("ADDRESS", jsonObject.getString("generic_location")); } catch (Exception e) { e.printStackTrace(); } return hm; } } convertJsonObjectToCardDetail this class just replace string with values from Json hope this solves your problem ....