目前日期文章:201502 (164)

瀏覽方式: 標題列表 簡短摘要

全域的物件及變數
WebClient wc = new WebClient();
string SPID = "";

步驟一:取得SPID(GETSPID)
private void button1_Click(object sender, EventArgs e)
{
string url="http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
string method="POST";
string postdata = "FUNC=GETSPID&USERID=apiblogt2&PASSWD=msnsdkt";
byte[] postbyte=Encoding.UTF8.GetBytes(postdata);
byte[] resb = wc.UploadData(url, method, postbyte);
string resmsg = Encoding.UTF8.GetString(resb);
resmsg = resmsg.Replace("\n", "");
string[] arrstr = resmsg.Split('\t');
if (arrstr[0] == "1")
{
SPID = arrstr[1];
MessageBox.Show("取得SPID成功: SPID= " + SPID);
}
else
{
SPID = "";
MessageBox.Show("取得SPID失敗: " + resmsg);
}
}

步驟二:將帳號註冊為msn機器人的連絡人(REGISTER)
下述: txtmsnacc.Text 為msn/yahoo帳號

private void button2_Click(object sender, EventArgs e)
{
string url = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
string method = "POST";
string postdata = "FUNC=REGISTER&uids=" + txtmsnacc.Text + "&session=" + SPID;
byte[] postbyte = Encoding.UTF8.GetBytes(postdata);
byte[] resb = wc.UploadData(url, method, postbyte);
string resmsg = Encoding.UTF8.GetString(resb);
resmsg = resmsg.Replace("\n", "");
string[] arrstr = resmsg.Split('\t');
if (arrstr[0] == "1")
{
MessageBox.Show("註冊成功: " + resmsg);
}
else
{
MessageBox.Show("註冊失敗: " + resmsg);
}
}

步驟三:發送訊息(SENDMSG)
private void button3_Click(object sender, EventArgs e)
{
string msg = "msnSDK測試訊息";
string url = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
string method = "POST";
string postdata = "FUNC=SENDMSG&uids=" + txtmsnacc.Text + "&msg=" + msg + "&encoding=utf-8&flags=0&session=" + SPID;
byte[] postbyte = Encoding.UTF8.GetBytes(postdata);
byte[] resb = wc.UploadData(url, method, postbyte);
string resmsg = Encoding.UTF8.GetString(resb);
resmsg = resmsg.Replace("\n", "");
string[] arrstr = resmsg.Split('\t');
if (arrstr[0] == "1")
{
MessageBox.Show("發送訊息成功: " + resmsg);
}
else
{
MessageBox.Show("發送訊息失敗: " + resmsg);
}
}

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

未命名  

程式碼下載


戮克 發表在 痞客邦 留言(0) 人氣()

1) 對要加微信的專案進行打包簽名,此時就有了自己的 keystore。

 

2) 將打包好的apk裝到機器上,再裝官方的獲取簽名工具:gen_signature.apk,並用此工具生成應用程式簽名。

 

3)用獲取的簽名去申請當前專案對應的微信App_ID ,此時才能保證在專案中調用成功。




再一個問題:分享圖片加文字

 

這部分就直接上代碼了:

 

戮克 發表在 痞客邦 留言(0) 人氣()

來源:http://www.blogjava.net/redalart/archive/2007/10/24/155485.html

 

 

 

为了对avi进行读写,微软提供了一套API,总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作。

  1、打开和关闭文件

  AVIFileOpen ,AVIFileAddRef, AVIFileRelease

  2、从文件中读取文件信息

  通过AVIFileInfo可以获取avi文件的一些信息,这个函数返回一个AVIFILEINFO结构,通过AVIFileReadData可以用来获取AVIFileInfo函数得不到的信息。这些信息也许不包含在文件的头部,比如拥有file的公司和个人的名称。

  3、写入文件信息

  可以通过AVIFileWriteData函数来写入文件的一些额外信息。

  4、打开和关闭一个流

  打开一个数据流就跟打开文件一样,你可以通过 AVIFileGetStream函数来打开一个数据流,这个函数创建了一个流的接口,然后在该接口中保存了一个句柄。

  如果你想操作文件的某一个单独的流,你可以采用AVIStreamOpenFromFile函数,这个函数综合了AVIFileOpen和AVIFileGetStream函数。

  如果你想操作文件中的多个数据流,你就要首先AVIFileOpen,然后AVIFileGetStream。

  可以通过AVIStreamAddRef来增加stream接口的引用。

  通过AVIStreamRelease函数来关闭数据流。这个函数用来减少streams的引用计数,当计数减少为0时,删除。

  5、从流中读取数据和信息

  AVIStreamInfo函数可以获取数据的一些信息,该函数返回一个AVISTREAMINFO结构,该结构包含了数据的类型压缩方法,建议的buffersize,回放的rate,以及一些description。

  如果数据流还有一些其它的额外的信息,你可以通过AVIStreamReadData函数来获取。应用程序分配一个内存,传递给这个函数,然后这个函数会通过这个内存返回数据流的信息,额外的信息可能包括数据流的压缩和解压缩的方法,你可以通过AVIStreamDataSize宏来回去需要申请内存块的大小。

  可以通过AVIStreamReadFormat函数获取数据流的格式信息。这个函数通过指定的内存返回数据流的格式信息,比如对于视频流,这个buffer包含了一个BIMAPINFO结构,对于音频流,内存块包含了WAVEFORMATEX或者PCMAVEFORMAT结构。你可以通过给AVIStreamReadFormat传递一个空buffer就可以获取buffer的大小。也可以通过AVIStreamFormatSize宏。

  可以通过AVIStreamRead函数来返回多媒体的数据。这个函数将数据复制到应用程序提供的内存中,对于视频流,这个函数返回图像祯,对于音频流,这个函数返回音频的sample数据。可以通过给AVIStreamRead传递一个NULL的buffer来获取需要的buffer的大小。也可以通过AVIStreamSampleSize宏来获取buffer的大小。

  有些AVI数据流句柄可能需要在启动数据流的前要做一下准备工作,此时,我们可以调用AVIStreamBeginStreaming函数来告知AVI数据流handle来申请分配它需要的一些资源。在完毕后,调用AVIStreamEndStreamming函数来释放资源。

  6、操作压缩的视频数据

  如果你要演示一祯或者几祯压缩视频图像时,你可以调用AVIStreamRead函数,将获取的数据传递给DrawDib函数来显示图像。这些函数可以显示压缩和未压缩的图像。

  AVIFile也提供了一个函数AVIStreamGetFrameOpen,来获取未压缩的视频祯,这个函数创建了内存来获取未压缩的数据。也可以通过AVIStreamGetFrame函数来解压缩一个单独的视频祯。这个函数可以解压缩某一祯图像,然后将数据以一个BIMAPINFOHEADER结构返回。当你调用完AVIStreamGetFrame函数后,要调用AVIStreamGetFrameClose函数释放上一个函数申请的资源。

  7、根据已存在的数据流创建文件

  创建一个包含多个数据流的文件的方法就是整合多个数据流,将其写入一个新文件。这些数据流可以是内存中的数据,也可以是存在于另一个文件中。

  我们可以用AVISave这个函数来build一个文件。这个函数可以创建一个文件,并且将指定的多个数据流按照指定的顺序写入文件,你也可以通过AVISaveV函数来创建一个新的文件,这个函数的功能和AVISave的功能一样,主要区别是AVISaveV采用的数据流数组,而AVISave是单个的数据流,多次保存。

  我们可以调用AVISaveOptions函数来显示一个对话框,可以让用户来选择压缩方式。

  我们可以在调用AVISave和AVISaveV函数时指定一个回调函数,用来显示avi文件的生成进度,可以让用户随时地取消生成avi文件。

  我们可以调用GetSaveFileNamePreview函数来显示保存的对话框让用户选择保存的文件名。

  通过AVIMakeFileFromStreams函数我们可以创建一个虚拟的文件句柄,其他的avi函数可以通过这个虚拟的文件句柄来操作文件中的数据流,操作完毕要记得调用AVIFileRelease释放。

8、向文件写入一个数据流

  我们可以通过AVIFileCreateStream函数来在一个新文件或者已经存在的文件中创建一个数据流。这个函数根据AVISTREAMINFO结构定义了新的数据流,并为新的数据流创建一个接口,返回接口的指针。

  在写入新的数据前,一定要指定流的格式信息,通过AVIStreamSetFormat函数,当设置一个视频流的时候,一定要使用BIMAPINFO结构来设置,音频就用WAVEFORMAT。

戮克 發表在 痞客邦 留言(0) 人氣()

轉載http://www.eoeandroid.com/thread-558403-1-1.html

 

1.主线程调用方法:
imageView = new ImageView(this);
AsynImageLoader asynImageLoader = new AsynImageLoader();
asynImageLoader.showImageAsyn(imageView, URL, R.drawable.nopicture);
mViewList.add(imageView);
2.AsynImageLoader加载缓存:
    public void showImageAsyn(ImageView imageView, String url, int resId){  
        imageView.setTag(url);  
        Bitmap bitmap = loadImageAsyn(url, getImageCallback(imageView, resId));      
        if(bitmap == null){  
            imageView.setImageResource(resId);  
        }else{  
            imageView.setImageBitmap(bitmap);  
        }  
    }  
public Bitmap loadImageAsyn(String path, ImageCallback callback){  
        // 判断缓存中是否已经存在该图片  
        if(caches.containsKey(path)){  
            // 取出软引用  
            SoftReference<Bitmap> rf = caches.get(path);  
            // 通过软引用,获取图片  
            Bitmap bitmap = rf.get();  
            // 如果该图片已经被释放,则将该path对应的键从Map中移除掉  
            if(bitmap == null){  
                caches.remove(path);  
            }else{  
                // 如果图片未被释放,直接返回该图片  
                Log.i(TAG, "return image in cache" + path);  
                return bitmap;  
            }  
        }else{  
            // 如果缓存中不常在该图片,则创建图片下载任务  
            Task task = new Task();  
            task.path = path;  
            task.callback = callback;  
            Log.i(TAG, "new Task ," + path);  
            if(!taskQueue.contains(task)){  
                taskQueue.add(task);  
                // 唤醒任务下载队列  
                synchronized (runnable) {  
                    runnable.notify();  
                }  
            }  
        }        
        // 缓存中没有图片则返回null  
        return null;  
    }  
private ImageCallback getImageCallback(final ImageView imageView, final int resId){  
        return new ImageCallback() {      
            @Override  
            public void loadImage(String path, Bitmap bitmap) {  
                if(path.equals(imageView.getTag().toString())){  
                    imageView.setImageBitmap(bitmap);  
                }else{  
                    imageView.setImageResource(resId);  
                }  
            }  
        };  
    }     
    private Handler handler = new Handler(){  
        @Override  
        public void handleMessage(Message msg) {  
            // 子线程中返回的下载完成的任务  
            Task task = (Task)msg.obj;  
            // 调用callback对象的loadImage方法,并将图片路径和图片回传给adapter  
            task.callback.loadImage(task.path, task.bitmap);  
        }  
          
    };  
    private Runnable runnable = new Runnable() {      
        @Override  
        public void run() {  
            while(isRunning){  
                // 当队列中还有未处理的任务时,执行下载任务  
                while(taskQueue.size() > 0){  
                    // 获取第一个任务,并将之从任务队列中删除  
                    Task task = taskQueue.remove(0);  
                    // 将下载的图片添加到缓存  
                    task.bitmap = PicUtil.getbitmap(task.path);  
                    caches.put(task.path, new SoftReference<Bitmap>(task.bitmap));  
                    if(handler != null){  
                        // 创建消息对象,并将完成的任务添加到消息对象中  
                        Message msg = handler.obtainMessage();  
                        msg.obj = task;  
                        // 发送消息回主线程  
                        handler.sendMessage(msg);  
                    }  
                }               
                //如果队列为空,则令线程等待  
                synchronized (this) {  
                    try {  
                        this.wait();  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    };  
    //回调接口  
    public interface ImageCallback{  
        void loadImage(String path, Bitmap bitmap);  
    }   
    class Task{  
        // 下载任务的下载路径  
        String path;  
        // 下载的图片  
        Bitmap bitmap;  
        // 回调对象  
        ImageCallback callback;  
        @Override  
        public boolean equals(Object o) {  
            Task task = (Task)o;  
            return task.path.equals(path);  
        }  
    }
3.获取网络图片:
/**
         * 根据一个网络连接(URL)获取bitmapDrawable图像
         * 
         * @param imageUri
         * @return
         */
        public static BitmapDrawable getfriendicon(URL imageUri) {

                BitmapDrawable icon = null;
                try {
                        HttpURLConnection hp = (HttpURLConnection) imageUri
                                        .openConnection();
                        icon = new BitmapDrawable(hp.getInputStream());// 将输入流转换成bitmap
                        hp.disconnect();// 关闭连接
                } catch (Exception e) {
                }
                return icon;
        }
        /**
         * 根据一个网络连接(String)获取bitmapDrawable图像
         * 
         * @param imageUri
         * @return
         */
        public static BitmapDrawable getcontentPic(String imageUri) {
                URL imgUrl = null;
                try {
                        imgUrl = new URL(imageUri);
                } catch (Exception e) {
                        e.printStackTrace();
                }
                BitmapDrawable icon = null;
                try {
                        HttpURLConnection hp = (HttpURLConnection) imgUrl.openConnection();
                        icon = new BitmapDrawable(hp.getInputStream());// 将输入流转换成bitmap
                        hp.disconnect();// 关闭连接
                } catch (Exception e) {
                }
                return icon;
        }
        /**
         * 根据一个网络连接(URL)获取bitmap图像
         * 
         * @param imageUri
         * @return
         */
        public static Bitmap getusericon(URL imageUri) {
                // 显示网络上的图片
                URL myFileUrl = imageUri;
                Bitmap bitmap = null;
                try {
                        HttpURLConnection conn = (HttpURLConnection) myFileUrl
                                        .openConnection();
                        conn.setDoInput(true);
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        bitmap = BitmapFactory.decodeStream(is);
                        is.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return bitmap;
        }
        /**
         * 根据一个网络连接(String)获取bitmap图像
         * 
         * @param imageUri
         * @return
         * @throws MalformedURLException
         */
        public static Bitmap getbitmap(String imageUri) {
                // 显示网络上的图片
                Bitmap bitmap = null;
                try {
                        URL myFileUrl = new URL(imageUri);
                        HttpURLConnection conn = (HttpURLConnection) myFileUrl
                                        .openConnection();
                        conn.setDoInput(true);
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        bitmap = BitmapFactory.decodeStream(is);
                        is.close();
                } catch (IOException e) {
                        e.printStackTrace();
                        return null;
                }
                return bitmap;
        }
        /**
         * 下载图片 同时写道本地缓存文件中
         * 
         * @param context
         * @param imageUri
         * @return
         * @throws MalformedURLException
         */
        public static Bitmap getbitmapAndwrite(String imageUri) {
                Bitmap bitmap = null;
                try {
                        // 显示网络上的图片
                        URL myFileUrl = new URL(imageUri);
                        HttpURLConnection conn = (HttpURLConnection) myFileUrl
                                        .openConnection();
                conn.setDoInput(true);
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        File cacheFile = FileUtil.getCacheFile(imageUri);
                        BufferedOutputStream bos = null;
                        bos = new BufferedOutputStream(new FileOutputStream(cacheFile));
                        byte[] buf = new byte[1024];
                        int len = 0;
                        // 将网络上的图片存储到本地
                        while ((len = is.read(buf)) > 0) {
                                bos.write(buf, 0, len);
                        }
                        is.close();
                        bos.close();
                        // 从本地加载图片
                        bitmap = BitmapFactory.decodeFile(cacheFile.getCanonicalPath());
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return bitmap;
        }
        public static boolean downpic(String picName, Bitmap bitmap) {
                boolean nowbol = false;
                try {
                        File saveFile = new File("/mnt/sdcard/download/weibopic/" + picName
                                        + ".png");
                        if (!saveFile.exists()) {
                                saveFile.createNewFile();
                        }
                        FileOutputStream saveFileOutputStream;
                        saveFileOutputStream = new FileOutputStream(saveFile);
                        nowbol = bitmap.compress(Bitmap.CompressFormat.PNG, 100,
                                        saveFileOutputStream);
                        saveFileOutputStream.close();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return nowbol;
        }

        public static void writeTofiles(Context context, Bitmap bitmap,
                        String filename) {
                BufferedOutputStream outputStream = null;
                try {
                        outputStream = new BufferedOutputStream(context.openFileOutput(
                                        filename, Context.MODE_PRIVATE));
                        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                }
        }
        /**
         * 将文件写入缓存系统中
         * 
         * @param filename
         * @param is
         * @return
         */
        public static String writefile(Context context, String filename,
                        InputStream is) {
                BufferedInputStream inputStream = null;
                BufferedOutputStream outputStream = null;
                try {
                        inputStream = new BufferedInputStream(is);
                        outputStream = new BufferedOutputStream(context.openFileOutput(
                                        filename, Context.MODE_PRIVATE));
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = inputStream.read(buffer)) != -1) {
                                outputStream.write(buffer, 0, length);
                        }
                } catch (Exception e) {
                } finally {
                        if (inputStream != null) {
                                try {
                                        inputStream.close();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                        if (outputStream != null) {
                                try {
                                        outputStream.flush();
                                        outputStream.close();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                }
                return context.getFilesDir() + "/" + filename + ".jpg";
        }
        // 放大缩小图片
        public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();
                Matrix matrix = new Matrix();
                float scaleWidht = ((float) w / width);
                float scaleHeight = ((float) h / height);
                matrix.postScale(scaleWidht, scaleHeight);
                Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height,
                                matrix, true);
                return newbmp;
        }
        // 将Drawable转化为Bitmap
        public static Bitmap drawableToBitmap(Drawable drawable) {
                int width = drawable.getIntrinsicWidth();
                int height = drawable.getIntrinsicHeight();
                Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
                                .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                : Bitmap.Config.RGB_565);
                Canvas canvas = new Canvas(bitmap);
                drawable.setBounds(0, 0, width, height);
                drawable.draw(canvas);
                return bitmap;
        }
        // 获得圆角图片的方法
        public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
                if (bitmap == null) {
                        return null;
                }
                Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                                bitmap.getHeight(), Config.ARGB_8888);
                Canvas canvas = new Canvas(output);
                final int color = 0xff424242;
                final Paint paint = new Paint();
                final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
                final RectF rectF = new RectF(rect);
                paint.setAntiAlias(true);
                canvas.drawARGB(0, 0, 0, 0);
                paint.setColor(color);
                canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
                paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
                canvas.drawBitmap(bitmap, rect, rect, paint);
                return output;
        }
        // 获得带倒影的图片方法
        public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
                final int reflectionGap = 4;
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();
                Matrix matrix = new Matrix();
                matrix.preScale(1, -1);
                Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,
                                width, height / 2, matrix, false);
                Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                                (height + height / 2), Config.ARGB_8888);
                Canvas canvas = new Canvas(bitmapWithReflection);
                canvas.drawBitmap(bitmap, 0, 0, null);
                Paint deafalutPaint = new Paint();
                canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);
                canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
                Paint paint = new Paint();
                LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                                bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
                                0x00ffffff, TileMode.CLAMP);
                paint.setShader(shader);
                // Set the Transfer mode to be porter duff and destination in
                paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
                // Draw a rectangle using the paint with our linear gradient
                canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
                                + reflectionGap, paint);
                return bitmapWithReflection;
        }  
4.图片加载到本地指定文件夹:
public static File getCacheFile(String imageUri){  
        File cacheFile = null;  
        try {  
            if (Environment.getExternalStorageState().equals(  
                    Environment.MEDIA_MOUNTED)) {  
                File sdCardDir = Environment.getExternalStorageDirectory();  
                String fileName = getFileName(imageUri);  
                File dir = new File(sdCardDir.getCanonicalPath()  
                        + "file:///android_asset/");  
                if (!dir.exists()) {  
                    dir.mkdirs();  
                }  
                cacheFile = new File(dir, fileName);  
                Log.i(TAG, "exists:" + cacheFile.exists() + ",dir:" + dir + ",file:" + fileName);  
            }    
        } catch (IOException e) {  
            e.printStackTrace();  
            Log.e(TAG, "getCacheFileError:" + e.getMessage());  
        }           
        return cacheFile;  
    }   
    public static String getFileName(String path) {  
        int index = path.lastIndexOf("/");  
        return path.substring(index + 1);  
    }


戮克 發表在 痞客邦 留言(0) 人氣()

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;

戮克 發表在 痞客邦 留言(0) 人氣()

FROM: http://developer.android.com/guide/developing/building/index.html#detailed-build

Building and Running

The following diagram depicts the components involved in building and running an application:


 

12595C394F386B4C189450  

 


A Detailed Look at the Build Process

戮克 發表在 痞客邦 留言(0) 人氣()

FROM:http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html

To share memory between different processes in the android framework ashmem can be used. Ashmem is a android shared memory addon to the linux kernel. 
Ashmem has reference counting so that if many processes use the same area the area will not be removed until all processes has released it, the memory is also virtual and not physically contiguous. If physically contiguous memory is needed like for hardware reasons pmem can be used, but it has no reference counting and is not part of standard Android kernel. 
In this blog post we will concentrate only on ashmem.

Ashmem is allocated via ashmem_create_region() that gives you an file descriptor then you use mmap() on it to get a memory area:

int fd = ashmem_create_region("SharedRegionName", size); if(fd == 0) {
  data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if(data != MAP_FAILED)
  {
    /* It works do your stuff*/
  }
}

But this will not solve your problem on how to share the memory area. The first problem is that the memory pointer "data" in our example above is per process and can't be shared. The next problem is that for security reasons the name "SharedRegionName" in the example above are not shared between processes. The "other" process that want to access the same shared memory area can't use a ashmem_create_region() with the same name to get access to the same physical memory area. Instead the file descriptor (fd in the example above) needs to be used in a new mmap() in the "other" process. Here comes the third problem, the file descriptor are per process and can't be shared with the other process just like that. Bummer!

The solution is to share the file descriptor with the binder since the binder has special functions that can be used to transfer file descriptors over it's interface. 

戮克 發表在 痞客邦 留言(0) 人氣()

Finally we're releasing our first app on Android Market. The app is actually a new type of game that is using the accelerometer in an exiting way. The game is really easy, all you have to do is to throw your phone up in the air as high as you dare. As mentioned we're using the accelerometer and also some secret algorithms to calculate how high a user can throw. We are also using an SQLLite database to store the highscores on the phone and a server with a SQL database to store global highscores.


During development we accidently crashed the sensors on one phone, but considering how many throws we've done, that's ok. Included in the game is four different highscores, Phone, National, Global and also a global hisghscore based on your phone model. 
Right now the Android Team record is 8.5m high! Do you dare try to beat us?!
The name of the game is SkyIsTheLimit and can be downloaded on android market. Search for "skyisthelimit". Or use the QR code with a barscanner:





戮克 發表在 痞客邦 留言(0) 人氣()

FriendFly   

I have been working with OpenGL on Android for a month and would like to share what I have learned so far. I will go through the main parts of the OpenGL specicode and explain a bit about the different pieces. 

When using version OpenGL ES 2.0, keep in mind that it is not backwards compatible with earlier versions such as 1.0 and 1.1. OpenGL ES 2.0 is supported by the Android platform since version 2.2. 

There are two sides of the coin so to speak. The client and the server. The client is the software that resides on the CPU side and the server can be seen as the software running on the GPU. So, on the client side you have the choice of developing your application in either Java or go native or mix. On the GPU side you will write vertex and fragment shaders that will execute in the programmable vertex processor or fragment processor on the GPU.

Now, open up the OpenGL ES 2.0 Reference page. It's a great source of information of what is available : 

http://www.khronos.org/opengles/sdk/docs/man/

戮克 發表在 痞客邦 留言(0) 人氣()

Starting an Android service after boot

 
After some consideration we decided that we should have a post about adding a regular Android service at boot and not just consider the cases where you have to modify the platform itself.

Simple boot service example

The key to this is the broadcast action android.intent.action.BOOT_COMPLETED that is sent out once the platform boot is complete. To perform an action on boot you need to include a broadcast receiver in your application that registers for this intent. The rest of the implementation follows the standard design for Android services and applications.
I have a small example that adds an Android service to perform a similar task as the native service that we had in the blog post about the init process. The service will start up at boot and then write something to the log at regular intervals. The first part we need is the broadcast receiver to take care of the boot intent:
package com.enea.training.bootdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Simple receiver that will handle the boot completed intent and send the intent to 
 * launch the BootDemoService.
 * @author BMB
 *
 */
public class BootDemoReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(final Context context, final Intent bootintent) {
  Intent mServiceIntent = new Intent();
mServiceIntent.setAction("com.enea.training.bootdemo.BootDemoService");
  context.startService(mServiceIntent);
 }
}
This component is basic and it will just create an intent to start our background service when it receives the boot completed intent.

The service will create a Timer task to write to the log at a preset interval. Once it is started the timer task will be registered and the service will keep running in the background.

戮克 發表在 痞客邦 留言(0) 人氣()

FROM : http://javaexpert.tistory.com/334

 
 Anyone that is in need of it .. attached here is the Motorola Atrix4G addon for the Android SDK .. also the instructions for installation and execution.


http://www.mediafire.com/?73hkz09wr0l1kqe

Installing and Using Motorola SDK Add-ons

A Motorola SDK add-on, when added to the Android™ SDK, allows you to run and debug your applications on an emulated Motorola handset. Note that while the device image that the add-on presents does not necessarily reflect the look of the actual device, from a functional standpoint it should be a fairly faithful emulation of the actual handset.

戮克 發表在 痞客邦 留言(0) 人氣()

  •  

FROM : http://snowbora.com/445

 在彈出對話方塊中,如下面的清單以查看花車顯示。

 

它是只是簡單的清單視圖中,不是清單,如圖像和文本視圖中所示。
 




首先,讓我們看看佈局

戮克 發表在 痞客邦 留言(0) 人氣()

FROM : http://www.androidside.com/B46/4671

 1930801786_69b809f0_BCBCB7CE  1930801786_5ec8b95d_BCBCB7CE_1  

 保持在螢幕垂直。

 

修改 AndroidManifest.xml 螢幕水準和垂直方向,你可以保持不變。


<activity android:name=".aa"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">

戮克 發表在 痞客邦 留言(0) 人氣()