⑴ android中如何上傳圖片到FTP伺服器
在安卓環境下可以使用,在java環境下也可以使用,已經在Java環境下實現了功能,然後移植到了安卓手機上,其它都是一樣的。
[java] view plain
package com.photo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FileTool {
/**
* Description: 向FTP伺服器上傳文件
*
* @param url
* FTP伺服器hostname
* @param port
* FTP伺服器埠
* @param username
* FTP登錄賬號
* @param password
* FTP登錄密碼
* @param path
* FTP伺服器保存目錄,是linux下的目錄形式,如/photo/
* @param filename
* 上傳到FTP伺服器上的文件名,是自己定義的名字,
* @param input
* 輸入流
* @return 成功返回true,否則返回false
*/
public static boolean uploadFile(String url, int port, String username,
String password, String path, String filename, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);// 連接FTP伺服器
// 如果採用默認埠,可以使用ftp.connect(url)的方式直接連接FTP伺服器
ftp.login(username, password);//登錄
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
// 測試
public static void main(String[] args) {
FileInputStream in = null ;
File dir = new File("G://pathnew");
File files[] = dir.listFiles();
if(dir.isDirectory()) {
for(int i=0;i<files.length;i++) {
try {
in = new FileInputStream(files[i]);
boolean flag = uploadFile("17.8.119.77", 21, "android", "android",
"/photo/", "412424123412341234_20130715120334_" + i + ".jpg", in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
以上為java代碼,下面是android代碼。
[java] view plain
package com.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new uploadThread().start();
}
class uploadThread extends Thread {
@Override
public void run() {
FileInputStream in = null ;
File dir = new File("/mnt/sdcard/DCIM/Camera/test/");
File files[] = dir.listFiles();
if(dir.isDirectory()) {
for(int i=0;i<files.length;i++) {
try {
in = new FileInputStream(files[i]);
boolean flag = FileTool.uploadFile("17.8.119.77", 21, "android", "android",
"/", "412424123412341234_20130715120334_" + i + ".jpg", in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
}
⑵ Android開發Tinker熱更新的問題
通過閱讀官方的技術文檔,始終沒有發現有對這個情況的相關配置項,所以只能從別處下手,最後發現,通過在 app mole 的 「build.gradle」 文件中,注釋掉依賴插件腳本,最終解決掉這個問題:
說兩句:
目前運行調試一切正常,不過要始終留意後續是否會出現問題;重要的一點是,當要打包新版本時,一定要解開這個注釋。
2、can』t the get signConfig for this build
問題:
執行 buildTinkerPatchRelease 打 Release 版本補丁包時報以下錯誤:
Error:Execution failed for task ':app:tinkerPatchRelease'.
> can't the get signConfig for this build
1
2
解決:
android {
...
// 簽名配置【buildTypes中調用了signingConfigs,則signingConfigs{}要置於buildTypes{}前面】
signingConfigs {
release {
try {
storeFile file("MyProject.jks")
storePassword "111111"
keyAlias "zhangzeqiao"
keyPassword "111111"
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
}
buildTypes {
release {
...
signingConfig signingConfigs.release
}
debug {
...
signingConfig signingConfigs.release
}
}
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
其中要特別注意,signingConfigs{} 方法體要置於 buildTypes{} 方法體前面,不然會報以下錯誤:
⑶ AndroidStudio4.0.1版本無法快速新建Activity解決辦法
AndroidStudio4.0.1版本,新建Activity的時候,點擊finish之後新建失敗沒有產生對應的Java及xml文件且沒有任何提示,如下圖方式新建:
問題原因:signingConfigs的寫法跟之前的版本有些不同。
解決辦法:改成新版本的方式即可恢復新建Activity的功能。
注意事項:
mole下的 build.gradle文件,如果你需要配置signingConfigs模塊,那麼有兩個規則需要遵守
1,signingConfigs模塊的配置需要寫在buildTypes模塊之前
android {
……
signingConfigs {
...…
}
buildTypes {
release {
……
}
debug {
……
}
}
}
如果不按順序寫,會報 Could not get unknown property 'xxxxxxx' for SigningConfig container of type org.gradle.api.internal.的錯誤
2,signingConfigs模塊裡面不能出現debug之類的亂念關鍵字
我之前的寫法如下所示(4.0版本不適用):
//錯誤寫法
signingConfigs {
debug {
storeFile file('key地址')
storePassword "密碼"
keyAlias "Alias名稱"
keyPassword "密碼"
}
}
buildTypes {
debug {
……
signingConfig signingConfigs.debug
}
}
//正確寫法,把signingConfigs模塊里的 「debug 」改成其他名字,例如改成test
signingConfigs {
test{
storeFile file('key地址'滑爛)
storePassword "密碼"
keyAlias "Alias名稱"
keyPassword "密碼"
嘩讓困 }
}
buildTypes {
debug {
……
signingConfig signingConfigs.test
}
}
修改完後,把項目里的build文件夾裡面的output.json文件刪掉,再次新建,新建成功
⑷ Android Studio 生成正式簽名apk(app-release.apk)的兩種方式
方式一:使用Android Studio生成
1.點擊Build->Generate,首次點擊可能會提示輸入操作系統密碼
2.彈出如下對話框,因為我們還沒有生成過keystore ,所以點擊Create new,新建keystore
3.填寫相關內容
Key store path 是 keystore的存放路徑
Alias 是別名,填寫APP名稱即可,別的名稱你記得住的也行
validity 是有效期限。
兩種密碼結合上一幅圖看
填寫完成後點擊ok
(記得備份,因為以後這個apk的新版本都是用這個keystore了)
4.彈出此窗口,自動填充好了這密碼和別名,Next
如果點擊了Remember passwords 可能需要輸入操作系統密碼。
5.填寫路徑,選擇簽名版本,點擊Finish
V2是Android 7.0出現的更安全更快速的簽名方式。
點擊ShowInExplore,或者自己打開路徑,就可以看到app-release.apk了
方式二:使用Gradle 生成
1.編輯 根目錄文件 gradle.properties
添加如下內容:
KEY_PATH=D:/Android/test1.jks
KEY_PASS=12345678
ALIAS_NAME=test
ALIAS_PASS=12345678
2.編輯 app/build.gradle 讀取指定的路徑密碼
在android 閉包中添加signingConfigs閉包:
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.example.test"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
config {
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
}
在buildTypes release 閉包中添加 signingConfig signingConfigs.config 應用前面的簽名配置(ps:signingConfigs閉包必須在buildTypes閉包前)
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
3.點擊右側工具欄的Gradle->項目名->:app->Tasks->build
assemble 用於生成測試版和正式版的apk
assembleDebug 用於生成測試版apk