I want to construct a BitmapImage from url in black berry. How can I do this?
Try to use the following code :
Bitmap img=Bitmap.createBitmapFromBytes((getImageFromUrl(url)).getBytes()), 0,-1, 1);
where getImageFromUrl(String url) is a method to fetch image from url.
public static String getImageFromUrl(String url) {
//Image img = null;
String imageData = null;
try
{
imageData = getDataFromUrl(url);
//img = Image.createImage(imageData.getBytes(), 0,imageData.length() );
}
catch(Exception e1) {
e1.printStackTrace();
}
return imageData;
}
public static String getDataFromUrl(String url)
throws IOException {
StringBuffer b = new StringBuffer();
InputStream is = null;
HttpConnection c = null;
long len = 0 ;
int ch = 0;
ConnectionFactory connFact = new ConnectionFactory();
ConnectionDescriptor connDesc;
connDesc = connFact.getConnection(url);
if (connDesc != null)
{
//HttpConnection httpConn;
c = (HttpConnection)connDesc.getConnection();
}
// c = (HttpConnection)Connector.open(url);
is = c.openInputStream();
len = c.getLength();
if( len != -1) {
// Read exactly Content-Length bytes
for(int i =0 ; i < len ; i++ )
if((ch = is.read()) != -1) {
b.append((char) ch);
}
} else {
//Read until the connection is closed.
while ((ch = is.read()) != -1) {
len = is.available() ;
b.append((char)ch);
}
}
is.close();
c.close();
return b.toString();
}
Hope this will solve your problem...:)
Related
Here is my code where i am getting profile image bytes from twitter api,
new Thread() {
public void run() {
byte dbata[] = getBitmap(profle_pic_str);
if (dbata != null) {
EncodedImage bitmap_img = EncodedImage.createEncodedImage(dbata, 0, -1);
Bitmap image =bitmap_img.getBitmap();
final Bitmap profle_pic_bmp = image;
final Bitmap scld_bmp = new Bitmap(90, 100);
Application.getApplication().invokeLater(new Runnable() {
public void run() {
if (profle_pic_bmp != null) {
profle_pic_bmp.scaleInto(scld_bmp, Bitmap.FILTER_LANCZOS);
phot_profle.setBitmap(scld_bmp);
} else {
Dialog.alert("null");
}
}
});
// } else {
// Dialog.alert("bytes are null");
}
}
}.start();
Here i have method getBitmap(profle_pic_str); which returning bytes array of image,
public byte[] getBitmap(String url) {
Bitmap bitmap = null;
String strg = HttpConnector.getConnectionString();
byte b[] = null;
try {
b = getXML(url + strg);
} catch (IOException ie) {
ie.printStackTrace();
}
return b;
}
the url which i used is this one
http://api.twitter.com/1/users/profile_image?screen_name=screen_nameof_user&size=bigger
public byte[] getXML(String url) throws IOException {
ContentConnection connection =
(ContentConnection) javax.microedition.io.Connector.open(url);
java.io.DataInputStream iStrm = connection.openDataInputStream();
java.io.ByteArrayOutputStream bStrm = null;
byte xmlData[] = null;
try {
// ContentConnection includes a length method
int length = (int) connection.getLength();
if (length != -1) {
xmlData = new byte[length];
// Read the png into an array
// iStrm.read(imageData);
iStrm.readFully(xmlData);
} else // Length not available...
{
bStrm = new java.io.ByteArrayOutputStream();
int ch;
while ((ch = iStrm.read()) != -1) bStrm.write(ch);
xmlData = bStrm.toByteArray();
bStrm.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// Clean up
if (iStrm != null) iStrm.close();
if (connection != null) connection.close();
if (bStrm != null) bStrm.close();
}
return xmlData;
}
When i am trying to convert byte array to EncodedImage
EncodedImage bitmap_img = EncodedImage.createEncodedImage(dbata, 0, -1);
in this line of code i am getting illegal argument exception.
same code is working for Facebook profile image. I dont know why this code giving error when i am doing for twitter. Please help me friends.
try this -
EncodedImage _encoded_img = EncodedImage.createEncodedImage(dbata, 0, dbata.length);
On your code,
EncodedImage bitmap_img = EncodedImage.createEncodedImage(dbata, 0,-1);
-1 is the length of the array. Its not static. Change -1 to dbata.length.
I am developing a blackberry application which retrieves image from the server , some of images are being retreived and other give error in the encodedImage Line
ImageFromUrl _img = new ImageFromUrl(item.getThumbLink());
byte[] bytes = _img.getbitmap();
Bitmap newBitmap = new Bitmap(width, fieldHeight);
if (bytes != null) {
// bitmap = Bitmap.createBitmapFromBytes(bytes, 0,
// bytes.length, Bitmap.SCALE_TO_FIT);
EncodedImage image = EncodedImage.createEncodedImage(bytes,
0, bytes.length);
}
and that's the connection which get the bytes
ImageFromUrl(String url) {
this.url = url;
}
public byte[] getbitmap() {
try {
connection = (HttpConnection) Connector.open(
url + Connection.getBlackBerryConnectionParams(),
Connector.READ, true);
InputStream is = connection.openInputStream();
DataInputStream dis = new DataInputStream(is);
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = dis.read()) != -1) {
// System.out.println((char) ch);
// msg = msg + (char) ch;
bStrm.write(ch);
}
dataArray = bStrm.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return dataArray;
}
how can I solve that to get all images without errors ?
Try this code:
public Bitmap getBitmapFromUrl(String url)
{
Bitmap bitmap=null;
try
{
HttpConnection connection=(HttpConnection)Connector.open(url);
connection.setRequestMethod(HttpConnection.GET);
InputStream is=connection.openInputStream();
int length=is.available();
byte[] data=new byte[length];
data=IOUtilities.streamToBytes(is);
connection.close();
is.close();
bitmap=Bitmap.createBitmapFromBytes(data,0,data.length,1);
if(bitmap!=null)
return bitmap;
else
return bitmap=Bitmap.getBitmapResource("noimage.png");
}
catch (Exception e)
{
return bitmap=Bitmap.getBitmapResource("noimage.png");
}
}
I am working on a blackberry application in which I need to hit a url create a connection and write a file and save that to SDcard. Currently I am following this particular code. But while creating FileOutputStream object it throws CLassCastException. I am struggling with this.
public void run() {
HttpConnection httpConnection = null;
DataOutputStream httpDataOutput = null;
InputStream httpInput = null;
OutputStream fos=null;
int rc;
try {
httpConnection = new HttpConnectionFactory()
.getHttpConnection("http://faultcode.techvalens.net/PDF/DrawingSample.PDF");
rc = httpConnection.getResponseCode();
if (rc != HttpConnection.HTTP_OK) {
throw new IOException("HTTP response code: " + rc);
}
httpInput = httpConnection.openInputStream();
InputStream is = httpInput;
FileConnection fconn=(FileConnection)Connector.open("file:///SDCard/Test.txt",
Connector.READ_WRITE);
if(!fconn.exists())
fconn.create();
System.out.println(fconn.exists());
fos = new FileOutputStream( File.FILESYSTEM_PATRIOT, "Test.txt" );
// byte[] b = IOUtilities.streamToBytes(inp);
byte[] buffer = new byte[702];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
} catch (Exception ex) {
System.out.println("URL Error........" + ex.getMessage());
} finally {
try {
if (httpInput != null)
httpInput.close();
if (httpDataOutput != null)
httpDataOutput.close();
if (httpConnection != null)
httpConnection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
the above code i am using.
Please let me know what is my mistake.
THanx in advance...!!!
The task was basic but created an unforgettable concept for me. Below is the code now i am using, its the best if i need to download any type file from URL.
public void run(){
GetURLWebService _webService = new GetURLWebService(methodName,elecID,pdfType,performedBy,notes);
String pdfURL = _webService.getWebServiceData();
_pdfURL = pdfURL;
System.out.println("Download the pdf...!!!");
try {
int chunkIndex = 0;
int totalSize = 0;
/*
* File connection
*/
FileConnection file =(FileConnection)Connector.open(localFile);
if (!file.exists()) {
file.create();
}
file.setWritable(true);
OutputStream out = file.openOutputStream();
/*
* HTTP Connections
*/
String currentFile = _pdfURL + connectionType();
//log("Full URL: " + currentFile);
HttpConnection conn;
InputStream in;
int rangeStart = 0;
int rangeEnd = 0;
while (true) {
// log("Opening Chunk: " + chunkIndex);
conn = (HttpConnection) Connector.open(currentFile,
Connector.READ_WRITE, true);
rangeStart = chunkIndex * chunksize;
rangeEnd = rangeStart + chunksize - 1;
// log("Requesting Range: " + rangeStart +
// "-" + rangeEnd);
conn.setRequestProperty("Range", "bytes=" +
rangeStart + "-" + rangeEnd);
int responseCode = conn.getResponseCode();
if (responseCode != 200 && responseCode != 206)
{
// log("Response Code = " + conn.getResponseCode());
break;
}
// log("Retreived Range: " + conn.getHeaderField("Content-Range"));
in = conn.openInputStream();
int length = -1;
byte[] readBlock = new byte[256];
int fileSize = 0;
while ((length = in.read(readBlock)) != -1) {
out.write(readBlock, 0, length);
fileSize += length;
Thread.yield(); // Try not to get cut off
}
totalSize += fileSize;
// log("Chunk Downloaded: " + fileSize + " Bytes");
chunkIndex++; // index (range) increase
in.close();
conn.close();
in = null;
conn = null;
/*
* Pause to allow connections to close and other Threads
* to run.
*/
Thread.sleep(1000);
}
// log("Full file downloaded: " + totalSize + " Bytes");
out.close();
file.close();
// log("Wrote file to local storage");
} catch (Exception e) {
System.out.println(e.toString());
}
}
private String connectionType() {
switch (conn) {
case 1:
return ";deviceside=false";
case 2:
return ";deviceside=true;interface=wifi";
default:
return ";deviceside=true";
}
}
I want to get the Bitmap from URL like -
"https://graph.facebook.com/100003506521332/picture"
I tried how-i-can-display-images-from-url-in-blackberry . But its showing http error 302 .It dont showing the Bitmap. How to resolve the problem ?.
String url = "https://graph.facebook.com/100003506521332/picture";
try
{
bitmap = globleDeclaration.getLiveImage(url, 50, 50);
bitmapField.setBitmap(bitmap);
}
catch (IOException e)
{
e.printStackTrace();
Dialog.alert(e.getMessage());
}
public Bitmap getLiveImage(String url,int width,int height) throws IOException
{
Bitmap bitmap = null;
try
{
byte[] responseData = new byte[10000];
int length = 0;
StringBuffer rawResponse = new StringBuffer();
httpconnection = (HttpConnection) Connector.open(url, Connector.READ, true);
String location=httpconnection.getHeaderField("location");
if(location!=null){
httpconnection = (HttpConnection) Connector.open(location, Connector.READ, true);
}else{
httpconnection = (HttpConnection) Connector.open(url, Connector.READ, true);
}
inputStream = httpconnection.openInputStream();
while (-1 != (length = inputStream.read(responseData)))
{
rawResponse.append(new String(responseData, 0, length));
}
int responseCode = httpconnection.getResponseCode();
if (responseCode != HttpConnection.HTTP_OK)
{
throw new IOException("HTTP response code: "
+ responseCode);
}
final String result = rawResponse.toString();
byte[] dataArray = result.getBytes();
encodeImageBitmap = EncodedImage.createEncodedImage(dataArray, 0, dataArray.length);
}
catch (final Exception ex)
{
System.out.print("Exception (" + ex.getClass() + "): " + ex.getMessage());
}
finally
{
try
{
inputStream.close();
inputStream = null;
httpconnection.close();
httpconnection = null;
}
catch(Exception e){}
}
return bitmap;
}
If you done get responce from this code httpconnection = (HttpConnection) Connector.open(url, Connector.READ, true); which is mention in above answer than u can also use alternative solution for that..
You can pass your your id here http://graph.facebook.com/100003506521332/?fields=picture&type=large than you will get one json responce like that {"picture": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/70678_100003506521332_1415569305_n.jpg"}
parse this json and get which you want exaclty .. than you will get responce using httpconnection = (HttpConnection) Connector.open(url, Connector.READ, true); also .
if you dont want larger image than remove &type=large from the above url.
//YOUR PACKAGE NAME
package ...........;
//*************************
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import net.rim.device.api.system.Bitmap;
public class Util_ImageLoader {
public static Bitmap getImageFromUrl(String url) {
Bitmap bitmap = null;
try {
String bitmapData = getDataFromUrl(url);
bitmap = Bitmap.createBitmapFromBytes(bitmapData.getBytes(), 0,
bitmapData.length(), 1);
} catch (Exception e1) {
e1.printStackTrace();
}
return bitmap;
}
private static String getDataFromUrl(String url) {
StringBuffer b = new StringBuffer();
InputStream is = null;
HttpConnection c = null;
long len = 0;
int ch = 0;
try {
c = (HttpConnection) Connector.open(url);
is = c.openInputStream();
len = c.getLength();
if (len != -1) {
for (int i = 0; i < len; i++)
if ((ch = is.read()) != -1) {
b.append((char) ch);
}
} else {
while ((ch = is.read()) != -1) {
len = is.available();
b.append((char) ch);
}
}
is.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
return b.toString();
}
}
copy this to your package....
Now, to use this class do like this>>>>>>>>
CREATE BITMAP OBJECT:
Bitmap IMAGE;
After That:
IMAGE=Util_ImageLoader.getImageFromUrl("https://graph.facebook.com/100003506521332/picture");
By the way, I think you have missed extension
like JPG,PNG, on your URL.... Check That
Now, add your bitmap where you would like to display the image......
ENJOY!
add(IMAGE);
Im having difficulties with the HttpConnection posting data to my server. The first time everything goes well. The second time it says; 'Stream already open', but i close everything after the response.
Here is my code:
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.location.*;
import java.io.*;
class GetSnowheights
{
HttpConnection http = null;
QualifiedCoordinates q = null;
public String result = "Geen data";
private boolean running;
public GetSnowheights(QualifiedCoordinates q) {
try
{
/*
this.http = (HttpConnection)Connector.open("http://www.diamond4it.nl/bb/");
this.http.setRequestMethod(HttpConnection.POST);
this.http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
*/
//Internet.getInstance();
this.http = Internet.getConnection();
}catch(Exception err){
err.printStackTrace();
}
this.q = q;
this.result = "Running";
}
public void GetResult(){
StringBuffer sb = new StringBuffer();
this.result = "GetResult";
if(this.http != null){
OutputStream os = null;
InputStream is = null;
try
{
//Send request
os = this.http.openOutputStream();
String data = "lat=1&lng=1";
//String data = "lat=" + this.q.getLatitude() + "&lng=" + this.q.getLongitude();
os.write(data.getBytes());
os.flush();
os.close();
this.result = "dataSend";
//Check response and read data
int res = this.http.getResponseCode();
this.result = "Result: " + res;
if(res == 200){
is = this.http.openInputStream();
int ch;
// Check the Content-Length first
long len = this.http.getLength();
if(len!=-1) {
for(int i = 0;i<len;i++){
if((ch = is.read())!= -1){
sb.append((char)ch);
}
}
} else {
// if the content-length is not available
while ((ch = is.read()) != -1){
sb.append((char)ch);
}
}
is.close();
}
this.result = sb.toString();
}catch(Exception err){
//err.printStackTrace();
this.result = err.toString() + "\r\n" + err.getMessage();
}finally{
if(is != null){
try{
is.close();
}catch(Exception err){
err.printStackTrace();
}
}
if(os != null){
try{
//os.flush();
os.close();
}catch(Exception err){
err.printStackTrace();
}
}
/*
if(http != null){
try{
http.close();
}catch(Exception err){
err.printStackTrace();
}
}
*/
}
}else{
this.result = "No connection";
}
}
}
2 ideas:
Why have you commented out the http.close() in finally block? We should always close HttpConnections.
Don't you call GetResult() from several threads simultaneously? If yes, then make the method synchronized by adding synchronized keyword in its definition.
P.S. I find the design of the class a bit misleading. It's very easy to make a mistake by incorrect usage of it. I'd combine GetSnowheights and GetResult into the only synchronized method.