⑴ 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