在这里,我们将给大家分享关于【Android】WebDavForAndroid的知识,让您更了解安卓webdav软件的本质,同时也会涉及到如何更有效地AndroidWebView从内部存储加载|And
在这里,我们将给大家分享关于【Android】WebDav For Android的知识,让您更了解安卓webdav软件的本质,同时也会涉及到如何更有效地Android WebView从内部存储加载| Android 11 | Android R、【Android 布局】在程序中设置 android:gravity 和 android:layo...、【Android】43,android开发游戏app、【Android】AES加密算法的Android实现的内容。
本文目录一览:- 【Android】WebDav For Android(安卓webdav软件)
- Android WebView从内部存储加载| Android 11 | Android R
- 【Android 布局】在程序中设置 android:gravity 和 android:layo...
- 【Android】43,android开发游戏app
- 【Android】AES加密算法的Android实现
【Android】WebDav For Android(安卓webdav软件)
最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用。
服务器提供商是使用国内的坚果云,还是非常良心的。
坚果云官网:https://www.jianguoyun.com
注册账号后,点击账户信息,安全选项中即可看到 第三方应用管理
这里需要三个东西,服务器地址、账户、密码(这个密码是你为应用单独开辟的,不是用户密码),具体参考:http://help.jianguoyun.com/?tag=webdav
拿到数据后,我们就可以开始进行安卓开发了。
1.依赖以及权限设置
因为涉及到网络,所以需要在Manifests中设置联网权限:
<uses-permission android:name="android.permission.INTERNET" />
同时注意安卓9.0以上的网络安全策略,需要单独配置一下:
在res新建一个 network_config.xml
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">www.pgyer.com</domain> <domain includeSubdomains="true">app-global.pgyer.com</domain> </domain-config> </network-security-config>
接着在Manifests的application中配置:
android:networkSecurityConfig="@xml/network__config"
webDav网上的教程不是特别多,一开始找到的是 lookfirst/sardine
该项目是使用的HttpClient且和安卓部分依赖有些冲突,所以不推荐直接使用
后来在github中找到一个移植到安卓的sardine,项目地址
经过测试可以直接使用。
implementation 'com.thegrizzlylabs.sardine-android:sardine-android:0.5'
2.基础使用方法
请注意:以下所有方法都必须在新线程中进行,且对UI的直接操作要放回主线程进行,可以考虑使用Handler
(1).初始化
Sardine sardine= new OkHttpSardine(); sardine.setCredentials(userName,password);
这里的userName,password即你的用户账号+分配的应用的所属密码
(2).获取目录下所有文件
List<DavResource> resources = null; try { resources = sardine.list("https://dav.jianguoyun.com/dav/");//如果是目录一定别忘记在后面加上一个斜杠 for (DavResource res : resources) { listNames=listNames+res+"\n"; } } catch (IOException e) { e.printstacktrace(); }
(3).判断路径(或文件)是否存在
//判断文件是否存在 if (sardine.exists("https://dav.jianguoyun.com/dav/file1.jpg")) System.out.println("got here!"); //判断路径是否存在 if (sardine.exists("https://dav.jianguoyun.com/dav/file/")) System.out.println("got here!");
若目录不存在,可以自己创建:
sardine.createDirectory("https://dav.jianguoyun.com/dav/ 目录名称/");
(4).下载文件
InputStream is = sardine.get("https://dav.jianguoyun.com/dav/"+"文件目录"+"afile.jpg");
(5).上传文件
byte[] data = FileUtils.readFiletoByteArray(new File("/file/on/disk")); sardine.put("http://yourdavserver.com/adirectory/nameOfFile.jpg", data);
或者使用
InputStream fis = new FileInputStream(new File("/some/file/on/disk.txt")); sardine.put("http://yourdavserver.com/adirectory/nameOfFile.jpg", fis);
节省内存空间
(6).删除文件
sardine.delete("http://yourdavserver.com/adirectory/nameOfFile.jpg");
Android WebView从内部存储加载| Android 11 | Android R
找到答案,
在定位setAllowFileAccess时,必须从Build.VERSION_CODES.R显式地将其设置为true
,否则将不允许您加载file:// URLs
。
所以解决方案是
webView.settings.allowFileAccess = true
在Java中,
webView.getSettings().setAllowFileAccess(true);
这在两种情况下都可以正常工作。
【Android 布局】在程序中设置 android:gravity 和 android:layo...
在进行 UI 布局的时候,可能经常会用到 android:gravity 和 android:layout_Gravity 这两个属性。
关于这两个属性的区别,网上已经有很多人进行了说明,这边再简单说一下。 (资料来自网络)
LinearLayout 有两个非常相似的属性:
android:gravity 与 android:layout_gravity。
他们的区别在于:
android:gravity 属性是对该 view 中内容的限定.比如一个 button 上面的 text. 你可以设置该 text 相对于 view 的靠左,靠右等位置.
android:layout_gravity 是用来设置该 view 相对与父 view 的位置.比如一个 button 在 linearlayout 里,你想把该 button 放在 linearlayout 里靠左、靠右等位置就可以通过该属性设置.
即 android:gravity 用于设置 View 中内容相对于 View 组件的对齐方式,而 android:layout_gravity 用于设置 View 组件相对于 Container 的对齐方式。
原理跟 android:paddingLeft、android:layout_marginLeft 有点类似。如果在按钮上同时设置这两个属性。
android:paddingLeft="30px" 按钮上设置的内容离按钮左边边界 30 个像素
android:layout_marginLeft="30px" 整个按钮离左边设置的内容 30 个像素
下面回到正题, 我们可以通过设置 android:gravity="center" 来让 EditText 中的文字在 EditText 组件中居中显示;同时我们设置 EditText 的 android:layout_gravity="right" 来让 EditText 组件在 LinearLayout 中居右显示。看下效果:
正如我们所看到的,在 EditText 中,其中的文字已经居中显示了,而 EditText 组件自己也对齐到了 LinearLayout 的右侧。
附上布局文件:
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <EditText
- android:layout_width="wrap_content"
- android:gravity="center"
- android:layout_height="wrap_content"
- android:text="one"
- android:layout_gravity="right"/>
- </LinearLayout>
那么上面是通过布局文件的方式来设置的。,相信大家都曾写过,那么如何通过 Java 代码来设置组件的位置呢?
依然考虑实现上述效果。
通过查看 SDK,发现有一个 setGravity 方法, 顾名思义, 这个应该就是用来设置 Button 组件中文字的对齐方式的方法了。
仔细找了一圈,没有发现 setLayoutgravity 方法, 有点失望。 不过想想也对, 如果这边有了这个方法, 将 Button 放在不支持 Layout_Gravity 属性的 Container 中如何是好!
于是想到, 这个属性有可能在 Layout 中 , 于是仔细看了看 LinearLayout 的 LayoutParams, 果然有所发现, 里面有一个 gravity 属性,相信这个就是用来设置组件相对于容器本身的位置了,没错,应该就是他了。
实践后发现,如果如此, 附上代码,各位自己看下。
代码比较简单,但是发现它们还是花了我一点时间的。
- Button button = new Button(this);
- button.setText("One");
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- // 此处相当于布局文件中的 Android:layout_gravity 属性
- lp.gravity = Gravity.RIGHT;
- button.setLayoutParams(lp);
- // 此处相当于布局文件中的 Android:gravity 属性
- button.setGravity(Gravity.CENTER);
- LinearLayout linear = new LinearLayout(this);
- // 注意,对于 LinearLayout 布局来说,设置横向还是纵向是必须的!否则就看不到效果了。
- linear.setOrientation(LinearLayout.VERTICAL);
- linear.addView(button);
- setContentView(linear);
或者这样也可以:
- Button button = new Button(this);
- button.setText("One");
- // 此处相当于布局文件中的 Android:gravity 属性
- button.setGravity(Gravity.CENTER);
- LinearLayout linear = new LinearLayout(this);
- // 注意,对于 LinearLayout 布局来说,设置横向还是纵向是必须的!否则就看不到效果了。
- linear.setOrientation(LinearLayout.VERTICAL);
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- // 此处相当于布局文件中的 Android:layout_gravity 属性
- lp.gravity = Gravity.RIGHT;
- linear.addView(button, lp);
- setContentView(linear);
好了,效果图就不上了,跟上面的一样。 就讲这么多。
【Android】43,android开发游戏app
android:layout_width=“match_parent”
android:layout_height=“250dp”
android:orientation=“vertical”>
<LinearLayout
android:layout_marginTop=“10dp”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:orientation=“vertical”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”>
<RelativeLayout
android:layout_weight=“2”
android:layout_width=“167dp”
android:layout_height=“192dp”>
<ImageView
android:layout_centerInParent=“true”
android:layout_width=“127dp”
android:layout_height=“162dp”
android:background="@drawable/dialog_photo" />
<LinearLayout
android:layout_marginLeft=“5dp”
android:layout_weight=“6”
android:orientation=“vertical”
android:layout_width=“match_parent”
android:layout_marginRight=“5dp”
android:layout_height=“192dp”>
<TextView
android:id="@+id/title"
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“新消息”
android:textStyle=“bold”
android:textAlignment=“center”
android:textSize=“22sp”/>
<TextView
android:id="@+id/contents"
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:scrollbars=“vertical”
android:text=“1.如果软件失效了,请等待修复。\n2.如果更新失败了,请手动更新。\n3.软件仅仅是整合搜索接口,不保存任何资源。”
android:textSize=“18sp”/>
<View
android:layout_marginTop=“5dp”
android:layout_width=“match_parent”
android:layout_height=“1dp”
android:background="#c0c0c0"/>
<RelativeLayout
android:id="@+id/btn_ok"
android:background="?android:attr/selectableItemBackground"
android:layout_width=“match_parent”
android:la
<TextView
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“已查阅”
android:textAlignment=“center”
android:textSize=“20sp”
android:textStyle=“bold”
android:layout_centerInParent=“true”
android:textColor="@color/purple_500"/>
4.新建MyDialog.java文件。
package jsz.nopi.firstapp;
import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class MyDialog extends Dialog {
//style引用style样式
public MyDialog(Context context, int width, int height, View layout, int style) {
super(context, style);
setContentView(layout);
Window window = getwindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.CENTER;
window.setAttributes(params);
}
}
5.修改MainActivity.java。
Window window = getwindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.CENTER;
window.setAttributes(params);
}
}
5.修改MainActivity.java。
【Android】AES加密算法的Android实现
1 import android.text.TextUtils; 2 import android.util.Base64; 3 import android.util.Log; 4 5 import javax.crypto.Cipher; 6 import javax.crypto.spec.IvParameterSpec; 7 import javax.crypto.spec.SecretKeySpec; 8 9 public class AESCBCUtils { 10 private static final String TAG = "AESCBCUtils"; 11 12 // CBC(Cipher Block Chaining, 加密快链)模式,PKCS5Padding补码方式 13 // AES是加密方式 CBC是工作模式 PKCS5Padding是填充模式 14 /** 15 * 加解密算法/工作模式/填充方式 16 */ 17 private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding"; 18 // AES 加密 19 private static final String AES = "AES"; 20 21 // 密钥偏移量 22 //private static final String mstrIvParameter = "1234567890123456"; 23 /* key必须为16位,可更改为自己的key */ 24 //String mstrTestKey = "1234567890123456"; 25 26 // 加密 27 /** 28 * AES 加密 29 * 30 * @param strKey 加密密钥 31 * @param strClearText 待加密内容 32 * @param mstrIvParameter 密钥偏移量 33 * @return 返回Base64转码后的加密数据 34 */ 35 public static String encrypt_AES(String strKey, String strClearText, String mstrIvParameter){ 36 37 try { 38 byte[] raw = strKey.getBytes(); 39 // 创建AES密钥 40 SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); 41 // 创建密码器 42 Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING); 43 // 创建偏移量 44 IvParameterSpec iv = new IvParameterSpec(mstrIvParameter.getBytes()); 45 // 初始化加密器 46 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 47 // 执行加密操作 48 byte[] cipherText = cipher.doFinal(strClearText.getBytes()); 49 //Log.d(TAG, "encrypt result(not BASE64): " + cipherText.toString()); 50 String strBase64Content = Base64.encodetoString(cipherText, Base64.DEFAULT); // encode it by BASE64 again 51 //Log.d(TAG, "encrypt result(BASE64): " + strBase64Content); 52 strBase64Content = strBase64Content.replaceAll(System.getProperty("line.separator"), ""); 53 54 return strBase64Content; 55 } catch (Exception e) { 56 e.printstacktrace(); 57 } 58 59 return null; 60 } 61 62 // 解密 63 /** 64 * AES 解密 65 * 66 * @param strKey 解密密钥 67 * @param strCipherText 待解密内容 68 * @param mstrIvParameter 偏移量 69 * @return 返回Base64转码后的加密数据 70 */ 71 public static String decrypt(String strKey, String strCipherText, String mstrIvParameter) throws Exception { 72 73 try { 74 byte[] raw = strKey.getBytes("ASCII"); 75 // 创建AES秘钥 76 SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); 77 // 创建密码器 78 Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING); 79 // 创建偏移量 80 IvParameterSpec iv = new IvParameterSpec(mstrIvParameter.getBytes()); 81 // 初始化解密器 82 cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); 83 // 执行解密操作 84 byte[] cipherText = Base64.decode(strCipherText, Base64.DEFAULT); // decode by BASE64 first 85 //Log.d(TAG, "BASE64 decode result(): " + cipherText.toString()); 86 byte[] clearText = cipher.doFinal(cipherText); 87 String strClearText = new String(clearText); 88 //Log.d(TAG, "decrypt result: " + strClearText); 89 90 return strClearText; 91 } catch (Exception e) { 92 e.printstacktrace(); 93 } 94 95 return null; 96 } 97 }
今天关于【Android】WebDav For Android和安卓webdav软件的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android WebView从内部存储加载| Android 11 | Android R、【Android 布局】在程序中设置 android:gravity 和 android:layo...、【Android】43,android开发游戏app、【Android】AES加密算法的Android实现的相关知识,请在本站搜索。
本文标签: