官网下载特别慢,下载下来放在百度网盘上 方便下载 适用于Unity平台的地图软件开发包(Maps SDK for Unity),是一个基于现实地图数据创建Unity应用的工具集。它让开发者可以与Mapbox提供的web服务接口(包括地图、地理位置、方向等应用程序接口)进行交互,并使用应用程序接口(基于C#语言)和图形化用户接口进行游戏的创建。
2024-07-17 17:13:44 75B Unity3D
1
xvideos安装包android
2024-07-16 23:45:44 5.11MB android
1
本文实例讲述了Android编程实现wifi扫描及连接的方法。分享给大家供大家参考,具体如下: 主界面,搜索附近WIFI信息 /** * Search WIFI and show in ListView * */ public class MainActivity extends Activity implements OnClickListener, OnItemClickListener { private Button search_btn; private ListView wifi_lv; private WifiUtils mUtils; priva
2024-07-16 15:41:48 67KB android开发 config
1
利用安卓现有漏洞直接像安卓10一样直接使用Android/data目录或者像安卓11一样授权Android/data目录,并且无需shizuku,只是简单写了一个授权和查看文件列表的实例,剩下直接参照别人开源的就可以,都差不多。
2024-07-15 01:41:44 156KB android
1
author:杨兴达; 邮箱:yangxingda1988@163.com 电话:180 1018 0585 Android 电源管理 -- wakelock机制,通过控制wakelock 实现保持pad 禁止休眠状态; Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的 或者 是没有超时的, 超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠. PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种: 第一种是永久的锁住,这样的锁除非显式的放开,否则是不会解锁的,所以这种锁用起来要非常的小心。 第二种锁是超时锁,这种锁会在锁住后一段时间解锁。 在创建了 PowerManager.WakeLock 后,有两种机制,第一种是不计数锁机制,另一种是计数锁机制。可以通过 setReferenceCounted(boolean value) 来指定,一般默认为计数机制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。而后者正真解锁是在( --count == 0 )的时候,同样当 (count == 0) 的时候才会去申请加锁。所以 PowerManager.WakeLock 的计数机制并不是正真意义上的对每次请求进行申请/释放每一把锁,它只是对同一把锁被申请/释放的次数进行了统计,然后再去操作。 源码 位置:frameworks/base/core/java/android/os/PowerManager.java ++++++++++++++++++++++++ 讲述 应用层 申请的锁 怎么传到kernel下面的,来理解 整个wakelock的框架。 比如android跑起来之后 在 /sys/power/wake_lock 下面的PowerManagerService 的生成过程。 1).应用程序申请锁 Android 提供了现成 android.os.PowerManager 类 , 类中 提供newWakeLock(int flags, String tag)方法 来取得 应用层的锁, 此函数的定义 frameworks/base/core/java/android/os/PowerManager.java 应用程序 在申请wake_lock时 都会有调用以下 部分。 实例: PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, “MyTag”); wl.acquire();//申请锁,这里会调用PowerManagerService里面acquireWakeLock() *********************** wl.release(); //释放锁,显示的释放锁,如果申请的锁不在此释放,系统就不会进入休眠。 ====================================== 2). frameworks层 /frameworks/base/services/java/com/android/server/PowerManagerService.java这个类是来管理 所有的应用程序 申请的wakelock。比如音视、频播放器、camera等申请的wakelock 都是通过这个类来 管理的。 static final String PARTIAL_NAME ="PowerManagerService" nativeAcquireWakeLock(PARTIAL_WAKE_LOCK_ID, PARTIAL_NAME); 上面 这个函数调用Power类 里面的 acquireWakeLock(),此时的PARTIAL_NAME作为参数传递到底层去。 public static native void nativeAcquireWakeLock(int lock, String id); 注:在PowerManagerService 类中没有实现nativeAcquireWakeLock,其实现体在 frameworks/base/core/jni/android_os_Power.cpp中,所以nativeAcquireWakeLock()方法时会调用JNI下的实现方法。 3).JNI层的实现 路径:frameworks/base/core/jni/android_os_Power.cpp // static void acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) { ************** const char *id = env->GetStringUTFChars(idObj, NULL); acquire_wake_lock(lock, id); env->ReleaseStringUTFChars(idObj, id); } 注:在acquireWakeLock()中调用了 路径下hardware/libhardware_legacy/power/power.c下面的acquire_wake_lock(lock, id) 4).与kernel层的交互 在power.c下的acquire_wake_lock(lock, id)函数如下: int acquire_wake_lock(int lock, const char* id) { ************** return write(fd, id, strlen(id)); } 注: fd就是文件描述符,在此 表示”/sys/power/wake_lock” id就是从PowerManagerService类中传下来的参数即:PARTIAL_NAME = "PowerManagerService" 到此 就是通过 文件系统 来与kernel层 交互的地方。 +++++++++++++++++++++++++++++++++++++++++++++++++++++ PowerManager类被应用程序调用,控制电源设备状态切换: PowerManager类对外有三个接口函数: 1、void goToSleep(long time); //强制设备进入Sleep状态 Note:在应用层调用该函数, 应用需要 在 源码下编译,用系统签名,否则 调用 此函数 出错; 2、newWakeLock(int flags, String tag);//取得相应层次的锁 flags参数说明: PARTIAL_WAKE_LOCK :保持CPU 运转,屏幕和键盘灯是关闭的。 SCREEN_DIM_WAKE_LOCK :保持CPU 运转,允许保持屏幕显示但有可能是灰的,关闭键盘灯 SCREEN_BRIGHT_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,关闭键盘灯 FULL_WAKE_LOCK :保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度 ACQUIRE_CAUSES_WAKEUP: 一旦有请求锁时,强制打开Screen和keyboard light ON_AFTER_RELEASE: 在释放锁时reset activity timer Note: 如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时 如果申请了其它的wakelocks,按Power键,系统还是会进Sleep 3、void userActivity(long when, boolean noChangeLights);//User activity事件发生,设备会被切换到Full on的状态,同时Reset Screen off timer. PowerManager和WakeLock的操作步骤 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemService().方法获取PowerManager实例。 然后通过PowerManager的newWakeLock ((int flags, String tag)来生成WakeLock实例。int Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。 获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他操作,最后使用release()释放(释放是必须的)。 Note: 1. 在使用以上函数的应用程序中,必须在其Manifest.xml文件中加入下面的权限: 2. 所有的锁必须成对的使用, 如果申请了而没有及时释放,会造成系统故障。如申请了partial wakelock,而没有及时释放, 那系统就永远进不了Sleep模式.
2024-07-13 12:01:59 1.36MB Android wakelock
1
在Android开发中,内部存储是应用私有的存储空间,用于保存应用的数据,这些数据对外部不可见,只有应用本身有权限访问。本文将详细介绍如何在Android Studio中获取内部存储路径,创建文件夹,以及进行读写和删除文件的操作。 获取内部存储路径通常使用Android的`getFilesDir()`或`getInternalStorageDirectory()`方法。`getFilesDir()`返回的是应用专属的文件目录,而`getInternalStorageDirectory()`则返回设备的根内部存储路径。例如: ```java File internalStorage = getFilesDir(); // 应用内部存储路径 File systemInternalStorage = Environment.getExternalStorageDirectory(); // 设备内部存储路径 ``` 创建文件夹可以通过`new File(path, folderName)`来实现,其中`path`是父目录路径,`folderName`是文件夹名称。接着调用`mkdir()`或`mkdirs()`确保文件夹创建成功: ```java String folderPath = internalStorage.getAbsolutePath() + "/MyFolder"; File myFolder = new File(folderPath); if (!myFolder.exists()) { myFolder.mkdir(); } ``` 读取文件,可以使用`BufferedReader`或者`InputStreamReader`,以下是一个示例: ```java File file = new File(internalStorage, "example.txt"); if (file.exists()) { BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { Log.d("Read", line); } reader.close(); } ``` 写入文件,可以使用`BufferedWriter`或`OutputStreamWriter`: ```java try (BufferedWriter writer = new BufferedWriter( new FileWriter(file))) { writer.write("这是写入文件的内容"); } catch (IOException e) { e.printStackTrace(); } ``` 删除文件,使用`delete()`方法: ```java if (file.exists()) { file.delete(); } ``` 对于压缩包子文件的文件名称列表中的"MySd",这可能是表示一个存档文件,例如ZIP或RAR格式。在Android中解压文件,可以使用第三方库如`android-zipfile`或`android-unzip`。以下是一个使用`android-zipfile`库的解压示例: ```java try (ZipFile zipFile = new ZipFile(context.getAssets().openFd("MySd.zip"))) { for ( Enumeration entries = zipFile.entries(); entries.hasMoreElements(); ) { ZipEntry entry = entries.nextElement(); String entryName = entry.getName(); File outputFile = new File(internalStorage, entryName); if (entry.isDirectory()) { outputFile.mkdirs(); } else { InputStream in = zipFile.getInputStream(entry); FileOutputStream out = new FileOutputStream(outputFile); byte[] buffer = new byte[1024]; int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } in.close(); out.close(); } } } catch (IOException e) { e.printStackTrace(); } ``` 以上就是关于Android内部存储读写文件,包括获取路径、创建文件夹、读写操作以及解压文件的基本知识。在实际应用中,还需要考虑异常处理、文件权限管理等更多细节,以确保文件操作的稳定性和安全性。
2024-07-12 14:42:20 18.67MB android 读写文件
1
在Android平台上,开发一款能够拍照、录像以及控制闪光灯的应用是一项常见的需求。`camera2` API是Android系统提供的一种高级相机接口,它为开发者提供了更精细的控制权,以实现复杂的相机功能。在这个名为"TestCamera"的Android Studio工程中,我们将深入探讨如何使用`camera2` API来实现这些功能。 我们需要在AndroidManifest.xml文件中添加必要的权限,以允许应用访问相机和录制视频: ```xml ``` 接下来,我们创建一个`CameraActivity`,在这个活动中初始化相机,并设置预览界面。这通常涉及到设置SurfaceView或TextureView作为相机的预览展示区: ```java private CameraManager cameraManager; private SurfaceView surfaceView; private TextureView textureView; // 可选,根据需求选择 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); surfaceView = findViewById(R.id.surface_view); textureView = findViewById(R.id.texture_view); // 如果使用TextureView cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String cameraId = cameraManager.getCameraIdList()[0]; // 获取第一个摄像头 cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {/*...*/}, null); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 在`StateCallback`中,我们需要实现打开、关闭相机的逻辑,以及设置预览会话和捕获器: ```java public class CameraStateCallback extends CameraDevice.StateCallback { @Override public void onOpened(@NonNull CameraDevice camera) { camera.createPreviewSession(setupPreviewSession(camera)); } private CameraCaptureSession.Callback setupPreviewSession(CameraDevice camera) {/*...*/} } ``` 对于拍照功能,我们需要创建一个`CaptureRequest.Builder`,设置适当的参数,然后提交请求到预览会话: ```java private void takePicture() { final CaptureRequest.Builder captureBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); captureBuilder.addTarget(imageReader.getSurface()); // imageReader用于保存图片 CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {/*...*/}; camera.createCaptureSession(Arrays.asList(captureBuilder.addTarget(surfaceView.getHolder().getSurface())), captureCallback, null); captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); // 开启闪光灯 camera.capture(captureBuilder.build(), captureCallback, null); } ``` 录像功能则需要用到`MediaRecorder`,配置并启动它来记录视频: ```java private void startRecording() { MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); mediaRecorder.setVideoSize(width, height); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); try { mediaRecorder.prepare(); mediaRecorder.start(); } catch (IOException e) { e.printStackTrace(); } } private File getOutputMediaFile(int type) {/*...*/} // 创建保存视频的文件 ``` 控制闪光灯的状态可以通过调用`CameraCharacteristics`的`FLASH_MODE`来实现: ```java CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String cameraId = cameraManager.getCameraIdList()[0]; CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Integer flashMode = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); if (flashMode != null && flashMode == 1) { // 检查相机是否支持闪光灯 if (isFlashOn) { cameraManager.setTorchMode(cameraId, false); // 关闭闪光灯 } else { cameraManager.setTorchMode(cameraId, true); // 打开闪光灯 } } } catch (CameraAccessException e) { e.printStackTrace(); } ``` 在实际应用中,还需要处理各种异常情况,比如权限问题、设备不支持等问题。此外,为了提供良好的用户体验,需要实现UI交互,如按钮点击事件,以触发拍照、录像和切换闪光灯操作。通过以上步骤,我们可以使用Android的`camera2` API创建一个功能完善的拍照、录像和控制闪光灯的应用。
2024-07-12 14:31:39 11.34MB
1
在Android开发中,OkHttp是一个高效且功能强大的网络请求库,它被广泛应用于网络数据的获取和发送。OkHttp的设计目标是减少网络延迟,提高应用程序的响应速度,并且提供了丰富的特性来支持现代HTTP协议。本资源包含的是OkHttp的3.8.1版本的jar包,以及与之匹配的Okio的1.9.0版本。 OkHttp的核心特性包括: 1. **连接池**:OkHttp维护了一个持久的连接池,可以重用先前建立的TCP连接,减少了握手和TLS协商的时间,从而提高了网络请求的速度。 2. **HTTP/2支持**:OkHttp支持HTTP/2协议,允许在一个TCP连接上并行处理多个请求,显著减少了网络延迟。 3. **WebSocket支持**:OkHttp提供WebSocket协议的支持,使得客户端和服务器之间可以进行全双工的实时通信。 4. **缓存机制**:OkHttp内置了缓存机制,可以在本地存储响应数据,避免不必要的网络请求,特别是在离线状态下也能访问之前加载过的数据。 5. **拦截器系统**:OkHttp引入了拦截器的概念,允许开发者在请求或响应过程中插入自定义逻辑,如添加请求头、改变请求方法等。 6. **异步和同步API**:OkHttp提供了异步和同步两种API,以适应不同场景的需求,异步API适合于需要处理大量并发请求的情况。 Okio是OkHttp依赖的数据处理库,它提供了一种更高效的方式来读写I/O流。1.9.0版本的Okio相比1.7.0,可能修复了一些已知问题,增加了新特性,或者优化了性能。例如,它可能增强了对大文件处理的效率,或者提供了更灵活的缓冲策略。 在使用OkHttp时,需要正确配置Okio作为其依赖,因为OkHttp内部会使用Okio来处理数据流。升级到1.9.0版本的Okio意味着可以利用其最新的优化,解决旧版本可能导致的问题,例如某些特定操作可能在旧版本中效率较低或者不支持。 OkHttp和Okio是Android开发者进行网络编程的重要工具,它们通过高效的网络请求管理和数据处理,提升了应用程序的性能和用户体验。在使用时,确保所有依赖库版本的兼容性至关重要,以避免因版本不匹配引发的问题。这个资源提供了最新稳定版本的OkHttp和Okio,对于正在使用这两个库的开发者来说,是一次及时的更新。
2024-07-12 09:49:58 438KB Android Okhttp
1
Unity WebGL是Unity游戏引擎的一个重要特性,它允许开发者将3D和2D游戏以及交互式内容无缝地部署到Web浏览器中,无需插件。这个"Unity WebGL视频流测试程序"是为了检验Unity WebGL项目是否能够有效地处理视频流内容,特别是通过WebGL在浏览器中播放。 在Unity中,使用Unity Media Player (UMP) 模块可以实现视频播放功能。UMP是一个内置的解决方案,支持多种视频格式,包括流媒体内容。在这个测试程序中,UMP可能被用来加载和播放视频源。用户只需要提供视频流地址,然后点击“Play”按钮,程序会尝试播放该视频。如果视频能够成功播放,那么意味着当前的WebGL环境支持视频流播放。 为了实现视频流播放,Unity WebGL需要依赖HTML5的Video API,这是现代浏览器内置的多媒体处理标准。在WebGL中,通常会利用WebGL纹理对象来渲染视频帧,这样视频内容就可以直接与3D场景结合,提供丰富的交互体验。 在描述中提到的"默认有一个可播放的视频地址"表明测试程序内已经预设了一个视频源,用于验证系统的基本功能。这可能是通过Unity的Scripting API设置的,例如使用`VideoPlayer`组件加载并播放视频。用户可以通过修改这个预设的视频URL或者添加新的URL来测试不同的视频流。 在压缩包"UMP_WEBGL"中,可能包含了以下内容: 1. Unity工程文件:这些文件包含了整个测试程序的源代码、资源和配置,可能包括Unity场景、脚本、纹理和其他媒体资源。 2. HTML和JavaScript文件:Unity WebGL导出的项目会生成一个包含HTML和JavaScript的打包文件,这些文件负责在浏览器中初始化和运行Unity WebGL应用程序。 3. Assets文件夹:Unity项目的资源存储在这里,可能包括UMP的相关设置和预设视频文件。 4. Build配置:可能包含构建设置,用于控制Unity如何生成WebGL输出。 要运行和分析这个测试程序,你需要使用Unity编辑器打开项目,检查其配置,尤其是与视频流相关的部分。然后,你可以导出WebGL版本并上传到服务器,通过浏览器进行测试。此外,还可以通过查看JavaScript代码来了解Unity WebGL是如何与浏览器的Video API交互的。 "Unity WebGL视频流测试程序"是一个实用工具,帮助开发者确认他们的WebGL项目是否具备播放视频流的能力。它涉及的技术包括Unity WebGL的集成、UMP组件的使用、HTML5 Video API的调用以及JavaScript与Unity的交互。理解这些知识点对于开发和优化Unity WebGL的视频应用至关重要。
2024-07-12 00:28:16 7.07MB unity webgl
1
4K Desert Sand Materials 4K高清沙漠沙材质包Unity游戏素材美术资源unitypackage 支持Unity版本2019.3.1或更高 沙。它是粗糙的、粗糙的、令人恼火的。它无处不在。我使用伊拉克沙漠沙子的个人照片参考,使用程序材质创作工具来制作这些真实的可平铺 4K 沙漠沙子材料。 该产品比“风格化”材质更真实、更细致,也比基于摄影测量的材质更具绘画性,它包括 5 种独特的沙子材质,旨在模拟细沙、粗沙、岩石沙、沙路和硬质沙子。 每种材质都有四种 4K 纹理,包括环境光遮挡、反照率、金属和法线贴图。高度图和平滑度被打包到金属的绿色和 Alpha 通道中。
2024-07-11 22:28:08 527.51MB unity unitypackage 游戏开发
1