Never Nop Tech

Never Nop Tech

分享軟體、旅遊、生活。

[Android] 拍照旋轉圖片

public class ImageUtil {

public static final String TAG = ImageUtil.class.getSimpleName();

/**
* 判斷圖片是否需要翻轉(正方向的不用翻轉)
*
* @param fileName
* @return
*/
public static boolean needRotate(CoNtext coNtext, String fileName) {
try {
ExifInterface exif = new ExifInterface(fileName);
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
LogUtil.d(TAG, “orientation is " + orientation);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return true;
case ExifInterface.ORIENTATION_ROTATE_270:
return true;
case ExifInterface.ORIENTATION_ROTATE_180:
return true;
}

return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}

/**
* 獲取翻轉到正方向的的圖片
*
* @param fileName
* @param maxWidth
* @param maxHeight
* @return
*/
public static void rotatedBitmap(CoNtext coNtext, String fileName,
String dstFile) {
try {
ExifInterface exif = new ExifInterface(fileName);
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
LogUtil.d(TAG, “orientation is " + orientation);
Matrix matrix = null;

switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix = new Matrix();
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix = new Matrix();
matrix.postRotate(270);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix = new Matrix();
matrix.postRotate(180);
break;
}

Bitmap bmp = getSmallBitmap(coNtext,
Uri.fromFile(new File(fileName)));
if (matrix != null) {
Bitmap bmp2 = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
bmp.getHeight(), matrix, true);
bmp.recycle();

FileOutputStream fos = new FileOutputStream(dstFile);
bmp2.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
bmp2.recycle();
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static boolean compress(CoNtext coNtext, Uri src, File dst, int rate) {
try {
Bitmap bmp = getSmallBitmap(coNtext, src);
FileOutputStream fos = new FileOutputStream(dst);
bmp.compress(Bitmap.CompressFormat.JPEG, rate, fos);
bmp.recycle();
bmp = null;
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {

final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;

}

public static Bitmap getSmallBitmap(CoNtext coNtext, Uri uri) {
try {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
InputStream is = coNtext.getContentResolver().openInputStream(uri);
BitmapFactory.decodeStream(is, null, options);
is.close();

Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 720, 1280);

Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

is = coNtext.getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);
is.close();
return bmp;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

[Android] 打開前置攝像頭和後置攝像頭

前言:
我 的android設備是原道N70雙擎pad。 這個平板電腦沒有後置攝像頭,只有前置攝像頭,當我安裝一些程式的時候,會出現「xxxx.apk已經終止」的錯誤,然後程式就會退出。 思前想後,發現一般的應用程式是安裝在手機上的,程式的預設攝像頭是後置攝像頭。 由於我的pad沒有後置攝像頭,所以,調用後置攝像頭就發生失敗! 怎麼解決呢?
解決問題
程式設計的時候,我們在調用Camera函數的open函數之前,必須查找是否有可用的攝像頭。 然後將查找到的攝像頭序號傳遞給Camera類的open函數。

 

@TargetApi(9)
private int FindFrontCamera(){
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); get cameras number

 

for ( int camIdx = 0; camIdx < cameraCount;camIdx++ ) {
Camera.getCameraInfo( camIdx, cameraInfo ); get camerainfo
if ( cameraInfo.facing ==Camera.CameraInfo.CAMERA_FACING_FRONT ) {
代表攝像頭的方位,目前有定義值兩個分別為CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK後置
return camIdx;
}
}
return -1;
}
@TargetApi(9)
private int FindBackCamera(){
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); get cameras number

 

for ( int camIdx = 0; camIdx < cameraCount;camIdx++ ) {
Camera.getCameraInfo( camIdx, cameraInfo ); get camerainfo
if ( cameraInfo.facing ==Camera.CameraInfo.CAMERA_FACING_BACK ) {
代表攝像頭的方位,目前有定義值兩個分別為CAMERA_FACING_FRONT前置和CAMERA_FACING_BACK後置
return camIdx;
}
}
return -1;
}
public void surfaceCreated(SurfaceHolder holder) {
int CammeraIndex=FindBackCamera();
if(CammeraIndex==-1){
CammeraIndex=FindFrontCamera();
}
mCamera = Camera.open(CammeraIndex);
}

android 關於EditView 輸入問題

很多寫登錄介面的開發者都會遇到一個問題:那就是在登錄介面時,當你點擊輸入框時,下邊的按鈕有時會被輸入框擋住,這個不利於用戶的體驗,所以很多人希望軟鍵盤彈出時,也能把按鈕擠上去。很多開發者想要監聽鍵盤的狀態,這無疑是一個很麻煩的做法。

 

我們可以在AndroidManifest.xml的Activity設置屬性:android:windowSoftInputMode = “adjustResize" ,軟鍵盤彈出時,要對主視窗佈局重新進行佈局,並調用onSizeChanged方法,切記一點當我們設置為「adjustResize」時,我們的介面不要設置為全屏模式,否則設置了這個屬性也不會有什麼效果。而當我們設置android: windowSoftInputMode = “adjustPan"時,主視窗就不會調用onSizeChanged方法,介面的一部分就會被軟鍵盤覆蓋住,就不會被擠到軟鍵盤之上了。

 

我們通過一段代碼來測試一下,當我們設置了該屬性後,彈出輸入法時,系統做了什麼:

 

重寫Layout佈局:

public class ResizeLayout extends LinearLayout{

    private static int count = 0;

    public ResizeLayout(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

    @Override

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

        super.onSizeChanged(w, h, oldw, oldh);

        Log.e(“onSizeChanged “ + count++, “=>onResize called! w="+w + “,h="+h+“,oldw="+oldw+“,oldh="+oldh);

    }

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        super.onLayout(changed, l, t, r, b);

        Log.e(“onLayout “ + count++, “=>OnLayout called! l=" + l + “, t=" + t + “,r=" + r + “,b="+b);

    }

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        Log.e(“onMeasure “ + count++, “=>onMeasure called! widthMeasureSpec=" + widthMeasureSpec + “, heightMeasureSpec=" + heightMeasureSpec);

    }

 

02.

 

我們的佈局設置為:

<com.winuxxan.inputMethodTest.ResizeLayout

    xmlns:android=“http://schemas.android.com/apk/res/android"

    android:id=“@+id/root_layout"

    android:layout_width=“fill_parent"

    android:layout_height=“fill_parent"

    android:orientation=“vertical"

    >

    <EditText

        android:layout_width=“fill_parent"

        android:layout_height=“wrap_content"

    />

    <LinearLayout

            android:id=“@+id/bottom_layout"

            android:layout_width=“fill_parent"

            android:layout_height=“fill_parent"

            android:orientation=“vertical"

            android:gravity=“bottom">s

    <TextView

        android:layout_width=“fill_parent"

        android:layout_height=“wrap_content"

        android:text=“@string/hello"

        android:background=“#77777777″

      />

   </LinearLayout>

</com.winuxxan.inputMethodTest.ResizeLayout>

 

02.

 

AndroidManifest.xml的Activity設置屬性:android:windowSoftInputMode = “adjustResize"
運行程式,點擊文字方塊,查看調試資訊:
E/onMeasure 6(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742024
E/onMeasure 7(7960): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec = 1073742025
E/onSizeChanged 8(7960): =>onSizeChanged called! w=320,h=201,oldw=320,oldh=377
E/onLayout 9(7960): =>OnLayout called! l=0, t=0,r=320,b=201
從調試結果我們可以看出,當我們點擊文字方塊後,根佈局調用了onMeasure,onSizeChanged和onLayout。

 

windowSoftInputMode的值如果設置為adjustPan,那麼該Activity主視窗並不調整螢幕的大小以便留出軟鍵盤的空間。相反,當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為用戶可能關閉軟鍵盤以便獲得與被覆蓋內容的交交互操作。
上面的例子中,我們將AndroidManifest.xml的屬性進行更改:android: windowSoftInputMode = “adjustPan"

 

重新運行,並點擊文字方塊,查看調試資訊:
E/onMeasure 6(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742200
E/onMeasure 7(8378): =>onMeasure called! widthMeasureSpec=1073742144, heightMeasureSpec=1073742201
E/onLayout 8(8378): =>OnLayout called! l=0, t=0,r=320,b=377
我們看到:系統也重新進行了measrue和layout,但是我們發現,layout過程中onSizeChanged並沒有調用,這說明輸入法彈出前後並沒有改變原有佈局的大小。

 

當然還有其他屬性可以設置:

 

“stateUnspecified"

 

軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。

 

這個是為了軟件盤行為默認的設置。

 

“stateUnchanged"

 

軟鍵盤被保持無論它上次是什麼狀態,是否可見或隱藏,當主視窗出現在前面時。

 

“stateHidden"

 

當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶確定導航到該Activity時,而不是返回到它由於離開另一個Activity。

 

“stateAlwaysHidden"

 

軟鍵盤總是被隱藏的,當該Activity主視窗獲取焦點時。

 

“stateVisible"

 

軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主視窗時)。

 

“stateAlwaysVisible"

 

當用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當用戶確定導航到該Activity時,而不是返回到它由於離開另一個Activity。

 

“adjustUnspecified"

 

它不被指定是否該Activity主視窗調整大小以便留出軟鍵盤的空間,或是否視窗上的內容得到螢幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴於是否視窗的內容有任何佈局視圖能夠滾動他們的內容。如果有這樣的一個視圖,這個視窗將調整大小,這樣的假設可以使滾動視窗的內容在一個較小的區域中可見的。這個是主視窗默認的行為設置。

 

“adjustResize"

 

該Activity主視窗總是被調整螢幕的大小以便留出軟鍵盤的空間

 

“adjustPan"

 

該Activity主視窗並不調整螢幕的大小以便留出軟鍵盤的空間。相反,當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為用戶可能關閉軟鍵盤以便獲得與被覆蓋內容的交交互操作。

 

相應用過Android手機的朋友都知道,有時候在文字方塊中輸入文字後,操作按鈕被輸入法遮擋了,不得不關閉輸入法才可以繼續操作。

 

比如下面這個畫面:

0_12977530695Rjx

畫面佈局:

 

<?xml version=“1.0″ encoding=“utf-8″?>  

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android"

    android:id=“@+id/ll2″ android:orientation=“vertical"

    android:layout_width=“fill_parent" android:layout_height=“fill_parent">

    <CheckBox android:id=“@+id/widget57″ android:layout_width=“wrap_content"

        android:layout_height=“wrap_content" android:text=“@string/location"

        android:layout_gravity=“right">

    </CheckBox>

    <EditText android:id=“@+id/widget34″ android:layout_width=“fill_parent"

        android:layout_height=“fill_parent" android:layout_weight=“1″

        android:textColorHighlight=“#cccccc" android:hint=“你想說什麼?"

        android:gravity=“top" android:textSize=“18sp">

    </EditText>

    <Button android:id=“@+id/widget53″ android:layout_width=“100px"

            android:layout_height=“wrap_content" android:text=“@string/share"

            android:layout_gravity=“right"/>

</LinearLayout>

 

如果不做任何操作,那麼點擊文字方塊後的效果肯定是下圖:

0_1297754184ACsf

此時,【共用】按鈕被輸入法擋住了,必須關閉輸入法才可以操作了。

 

有的朋友會說,可以在佈局外面再加一個ScrollView,這樣的畫,UI佈局就和輸入法分離了,輸入法出現後,上面還可以滾動。

 

但是這樣的效果好嗎? 我們來看一下效果(佈局外加ScrollView的效果):

0_12977534212DU4

畫面佈局:

<?xml version=“1.0″ encoding=“utf-8″?>

<ScrollView xmlns:android=“http://schemas.android.com/apk/res/android"

android:layout_width=“fill_parent" android:layout_height=“fill_parent"

android:orientation=“vertical">

<LinearLayout

android:id=“@+id/ll2″ android:orientation=“vertical"

android:layout_width=“fill_parent" android:layout_height=“fill_parent">

<CheckBox android:id=“@+id/widget57″ android:layout_width=“wrap_content"

android:layout_height=“wrap_content" android:text=“@string/location"

android:layout_gravity=“right">

</CheckBox>

<EditText android:id=“@+id/widget34″ android:layout_width=“fill_parent"

android:layout_height=“400px" android:layout_weight=“1″

android:textColorHighlight=“#cccccc" android:hint=“你想說什麼?"

android:gravity=“top" android:textSize=“18sp">

</EditText>

<Button android:id=“@+id/widget53″ android:layout_width=“100px"

android:layout_height=“wrap_content" android:text=“@string/share"

android:layout_gravity=“right"/>

</LinearLayout>

</ScrollView>

0_1297753550CMCI

從圖中可以看出,上面部分右側有一個滾動條,用戶可以通過從下滾動來點擊按鈕。但是個人覺得,這樣還不如直接關閉輸入法來點擊按鈕來的方便!

 

那麼有沒有更好的辦法呢? 答案是有!

 

先看一下這個更好的方法是什麼效果:

 

從圖中可以看出,UI佈局也與輸入法分離了,同時EditText區域自動縮小了。這樣的話,即不影響用戶輸入,也不影響用戶進一步操作!

 

而且即使打開了輸入法,用戶也可以看到UI全貌,感覺比較舒服、友好。

 

下面就說一下,這個效果是如何做到的.

 

其實答案很簡單,不需要更改局部檔,而是修改AndroidManifest.xml檔,在Activity屬性中加一條:

 

android:windowSoftInputMode=“adjustResize"

 

AndroidManifest.xml修改前後比較:

0_129775418966CA

From:CSDN

共 42 頁    1 40 41 42
共 42 頁    1 40 41 42