android 中實(shí)現(xiàn)網(wǎng)頁調(diào)用攝像頭功能方法·如下:
公司主營(yíng)業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出建平免費(fèi)做網(wǎng)站回饋大家。
1/apk/res/android"
xmlns:tools="schemas/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".CameraWebviewActivity"
Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Camera"
android:layout_alignParentTop="true"
/
WebView
android:id="@+id/wv"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@+id/bt"
/
/RelativeLayout
4.、編寫activity:
public class CameraWebviewActivity extends Activity {
private final static String TAG = "CameraWebviewActivity";
private Button bt;
private WebView wv;
public String fileFullName;//照相后的照片的全整路徑
private boolean fromTakePhoto; //是否是從攝像界面返回的webview
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_webview);
initViews();
}
private void initViews() {
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("----------------");
takePhoto( Math.random()*1000+1 + ".jpg");
}
});
wv = (WebView) findViewById(R.id.wv);
WebSettings setting = wv.getSettings();
setting.setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
wv.setWebChromeClient(new WebChromeClient(){
@Override//實(shí)現(xiàn)js中的alert彈窗在Activity中顯示
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(TAG, message);
result.confirm();
return true;
}
});
wv.loadUrl("");
final Handler mHandler = new Handler();
//webview增加javascript接口,監(jiān)聽html頁面中的js點(diǎn)擊事件
wv.addJavascriptInterface(new Object(){
public String clickOnAndroid() {//將被js調(diào)用
mHandler.post(new Runnable() {
public void run() {
fromTakePhoto = true;
//調(diào)用 啟用攝像頭的自定義方法
takePhoto("testimg" + Math.random()*1000+1 + ".jpg");
System.out.println("========fileFullName: " + fileFullName);
}
});
return fileFullName;
}
}, "demo");
}
/*
* 調(diào)用攝像頭的方法
*/
public void takePhoto(String filename) {
System.out.println("----start to take photo2 ----");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_MEDIA_TITLE, "TakePhoto");
//判斷是否有SD卡
String sdDir = null;
boolean isSDcardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(isSDcardExist) {
sdDir = Environment.getExternalStorageDirectory().getAbsolutePath();
} else {
sdDir = Environment.getRootDirectory().getAbsolutePath();
}
//確定相片保存路徑
String targetDir = sdDir + "/" + "webview_camera";
File file = new File(targetDir);
if (!file.exists()) {
file.mkdirs();
}
fileFullName = targetDir + "/" + filename;
System.out.println("----taking photo fileFullName: " + fileFullName);
//初始化并調(diào)用攝像頭
intent.putExtra(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(fileFullName)));
startActivityForResult(intent, 1);
}
/*
* (non-Javadoc)
* @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
* 重寫些方法,判斷是否從攝像Activity返回的webview activity
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("----requestCode: " + requestCode + "; resultCode " + resultCode + "; fileFullName: " + fileFullName);
if (fromTakePhoto requestCode ==1 resultCode ==-1) {
wv.loadUrl("javascript:wave2('" + fileFullName + "')");
} else {
wv.loadUrl("javascript:wave2('Please take your photo')");
}
fromTakePhoto = false;
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.camera_webview, menu);
return true;
}
}
在一些Android應(yīng)用的開發(fā)中,需要通過JNI和 Android NDK工具實(shí)現(xiàn)JAVA和C/C++之間的相互調(diào)用。
Java Native Interface (JNI)標(biāo)準(zhǔn)是java平臺(tái)的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。JNI是本地編程接口,它使得在 Java 虛擬機(jī) (VM)內(nèi)部運(yùn)行的 Java代碼能夠與用其它編程語言(如 C、C++和匯編語言)編寫的應(yīng)用程序和庫(kù)進(jìn)行交互操作。
NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和java應(yīng)用一起打包成apk。這些工具對(duì)開發(fā)者的幫助是巨大的。NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、ABI等差異,開發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。NDK可以自動(dòng)地將so和Java應(yīng)用一起打包,極大地減輕了開發(fā)人員的打包工作。
ADB是一個(gè) 客戶端-服務(wù)器端 程序, 其中客戶端是你用來操作的電腦, 服務(wù)器端是android設(shè)備.
先說安裝方法, 電腦上需要安裝客戶端. 客戶端包含在sdk里. 設(shè)備上不需要安裝, 只需要在手機(jī)上打開選項(xiàng)settings-applications-development-USBdebugging.
對(duì)于Mac和Linux用戶, 下載好的sdk解壓后, 可以放~或者任意目錄. 然后修改~/.bash_profile文件, 設(shè)置運(yùn)行環(huán)境指向sdk的tools目錄.
具體是打開~/.bash_profile文件(如果沒有此文件也可以自行添加), 在里面加入一行:
export PATH=${PATH}:你的sdk目錄/tools
然后就可以使用adb命令了.
嫌安裝麻煩的同學(xué)其實(shí)也可以省去上面安裝步驟, 直接輸入完整路徑來使用命令
對(duì)于windows xp用戶, 需要先安裝usb驅(qū)動(dòng)
android_usb_windows.zip (1.33 MB) , 然后如果你只打算使用adb而不想下載整個(gè)sdk的話, 可以下載這個(gè)單獨(dú)的adb工具包
adb_win.zip (571.56 KB) 下載后解壓, 把里面 adb.exe 和 AdbWinApi.dll 兩個(gè)文件放到系統(tǒng)盤的 windows/system32 文件夾里就可以了
1.確定手機(jī)root了,取得了root權(quán)限才能刪除系統(tǒng)文件呀.
2.下載Android_db.rar,解壓到%windir/%System32下.
3.手機(jī)連接數(shù)據(jù)線,在電腦上打開cmd,然后輸入命令
adb remount
adb shell
su
執(zhí)行完成之后,你會(huì)看到:
* daemon not running. starting it now *
* daemon started successfully *
4.接著就是Linux命令行模式了,輸入
cd system/app
你會(huì)發(fā)現(xiàn)沒啥變化,然后輸入ls回車.
這時(shí)候列表顯示了system/app里面的所有文件,也就是Rom集成的一些軟件了.
5.開始刪除吧.比如刪除Youtube,他的文件名是Youtube.odex和Youtube.apk
我們要?jiǎng)h除這2個(gè)文件,敲入以下命令:
rm Youtube.*
重啟,Youtube已經(jīng)刪除掉了,注意各位同學(xué)千萬不要?jiǎng)h除你不知道是啥的東西.
指定允許AVD的內(nèi)存大?。?/p>
emulator -avd avdName -partition-size 256
啟動(dòng)一個(gè)叫avdName的模擬器,允許內(nèi)存最大為256MADB常用的幾個(gè)命令
1. 查看設(shè)備
adb devices
這個(gè)命令是查看當(dāng)前連接的設(shè)備, 連接到計(jì)算機(jī)的android設(shè)備或者模擬器將會(huì)列出顯示
2. 安裝軟件
adb install
這個(gè)命令將指定的apk文件安裝到設(shè)備上
3. 卸載軟件
adb uninstall 軟件名
adb uninstall -k 軟件名
如果加 -k 參數(shù),為卸載軟件但是保留配置和緩存文件.
4. 登錄設(shè)備shell
adb shell
adb shell
這個(gè)命令將登錄設(shè)備的shell.
后面加將是直接運(yùn)行設(shè)備命令, 相當(dāng)于執(zhí)行遠(yuǎn)程命令
5. 從電腦上發(fā)送文件到設(shè)備
adb push 本地路徑 遠(yuǎn)程路徑
用push命令可以把本機(jī)電腦上的文件或者文件夾復(fù)制到設(shè)備(手機(jī))
6. 從設(shè)備上下載文件到電腦
adb pull 遠(yuǎn)程路徑 本地路徑
用pull命令可以把設(shè)備(手機(jī))上的文件或者文件夾復(fù)制到本機(jī)電腦
7. 顯示幫助信息
adb help
這個(gè)命令將顯示幫助信息
刪除Android系統(tǒng)Rom自帶的軟件
Android系統(tǒng)沒有卸載Rom自帶軟件的功能.可能有些同學(xué)很想刪除廢了武功的Youtube,想刪除墻那邊的Twitter.
加上Android的快捷方式?jīng)]法修改沒法自己排序沒法分頁.
安裝的程序太多就會(huì)發(fā)現(xiàn)原來找到自己想要的東西很難.
綜上所述,我覺得告知各位菜鳥同學(xué)如何刪除自帶的程序是很有必要的一件事情.1.確定手機(jī)root了,取得了root權(quán)限才能刪除系統(tǒng)文件呀.
2.下載Android_db.rar,解壓到%windir/%System32下.
3.手機(jī)連接數(shù)據(jù)線,在電腦上打開cmd,然后輸入命令
adb remount
adb shell
su
執(zhí)行完成之后,你會(huì)看到:
* daemon not running. starting it now *
* daemon started successfully *
4.接著就是Linux命令行模式了,輸入
cd system/app
你會(huì)發(fā)現(xiàn)沒啥變化,然后輸入ls回車.
這時(shí)候列表顯示了system/app里面的所有文件,也就是Rom集成的一些軟件了.
5.開始刪除吧.比如刪除Youtube,他的文件名是Youtube.odex和Youtube.apk
我們要?jiǎng)h除這2個(gè)文件,敲入以下命令:
rm Youtube.*
重啟,Youtube已經(jīng)刪除掉了,注意各位同學(xué)千萬不要?jiǎng)h除你不知道是啥的東西.
指定允許AVD的內(nèi)存大?。?/p>
emulator -avd avdName -partition-size 256
啟動(dòng)一個(gè)叫avdName的模擬器,允許內(nèi)存最大為256M
以上參考百度經(jīng)驗(yàn),希望對(duì)你有幫助