首页 文章 精选 留言 我的

精选列表

搜索[安卓系统],共10021篇文章
优秀的个人博客,低调大师

jenkins 安卓打包

环境准备 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 找一个台新机器,因为要升级内核文件,我升级,中文全部识别不了,全是乱码,没解决 yum - yinstallgccgcc - c + + autoconfautomake yuminstallglibc - common 解决libc.so. 6 :version`GLIBC_2. 14 ' not found问题 http: / / stuart.blog. 51cto .com / 728677 / 1840205 http: / / blog.csdn.net / cpplang / article / details / 8462768 curlhttp: / / dl.google.com / android / ndk / android - ndk - r10e - linux - x86_64. bin - - output / usr / java / android - ndk - r10e - linux - x86_64. bin android list sdk - u http: / / www.cnblogs.com / sink_cup / archive / 2011 / 12 / 01 / 2230344.html Ubuntu 15.10 x64安装AndroidSDK / usr / java / androidsdk / tools / bin sdkmanager "build-tools;25.0.0" / usr / java / androidsdk / platform - tools buildscript{ repositories{ jcenter() } dependencies{ classpath 'com.android.tools.build:gradle:2.3.1' } } http: / / blog.csdn.net / CheNorton / article / details / 50345039 工作环境搭建( 9 ) - CentOS7命令行安装AndroidNDK http: / / blog.csdn.net / CheNorton / article / details / 50353036 工作环境搭建( 8 ) - CentOS7命令行安装AndroidSDK http: / / blog.csdn.net / chenorton / article / details / 50345039 centos7中安装AndroidSDK的方法步骤 http: / / www.jb51.net / article / 119183.htm cat / etc / profile exportJAVA_HOME = / usr / java / jdk exportJRE_HOME = / usr / java / jdk / jre exportCLASSPATH = .:$JAVA_HOME / lib / dt.jar:$JAVA_HOME / lib / tools.jar:$JRE_HOME / lib exportPATH = $JAVA_HOME / bin :$PATH exportANDROID_SDK_HOME = / usr / java / android - sdk - linux exportANDROID_HOME = / usr / java / android - sdk - linux exportGRADLE_HOME = / usr / java / gradle - 3.3 exportMAVEN_HOME = / usr / java / apache - maven - 3.3 . 9 exportPATH = / usr / local / apr / bin :$MAVEN_HOME / bin :$PATH exportPATH = / usr / java / androidsdk / platform - tools: / usr / java / androidsdk / tools / bin :$ANDROID_HOME:$ANDROID_HOME / tools:$ANDROID_HOME / platform - tools:$ANDROID_SDK_HOME / tools:$ANDROID_SDK_HOME / platform - tools:$GRADLE_HOME / bin : / usr / local / apr / bin : / usr / java / apache - maven - 3.3 . 9 / bin : / root / shell: / usr / java / jdk / bin : / usr / lib64 / qt - 3.3 / bin : / usr / local / sbin: / usr / local / bin : / sbin: / bin : / usr / sbin: / usr / bin : / root / bin : / usr / local / git / bin exportMAVEN_OPTS = "-Xms1024m-Xmx1024m" 具体步骤 1.libc.so.6: version `GLIBC_2.14' not found 2.先安装androidsdk,生成证书文件夹 3.android list sdk -u 更新 ./android update sdk -u -t add-on,extra,platform,platform-tool,tool 包 http://services.gradle.org/distributions/ gradle安装包 注意 兼容性 yum whatprovides libstdc++.so.6 编译步骤 1.bulid.g 修改 2.linc 文件 3.命令 4.移动依赖的文件 5.壳 setting gradle clean build gradle assemble_devdebug 主工程 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.1' } } 模块 PullToRefresh buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' } } 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 29 buildscript{ repositories{ jcenter() } dependencies{ classpath 'com.android.tools.build:gradle:2.3.1' } } def getCurrentTime(){ return newDate(). format ( "yyyyMMddHHmm" ,TimeZone.getTimeZone( "UTC" )) } apply plugin: 'com.android.application' android{ lintOptions{ abortOnErrorfalse } android.applicationVariants. all {variant - > variant.outputs.each{output - > def outputFile = output.outputFile if (outputFile! = null&&outputFile.name.endsWith( '.apk' )){ def buildType = variant.buildType.name def fileName = "andpl_V${defaultConfig.versionName}_${getCurrentTime()}${variant.productFlavors[0].name}.apk" output.outputFile = new File (outputFile.parent,fileName) } } } 3.jenkins配置 clean assemble${PRODUCT_FLAVOR}${BUILD_TYPE} --stacktrace --debug BUILD_TYPE Release PRODUCT_FLAVOR Beta CODE_BRANCH develop VERSION 1.0.0 编译指定productFlavor及buildType的apk $gradle assemble[productFlavor][buildType] 需要动态写入的参数有versionName、打包时间戳、是来自Jenkjins运行还是我们本地打包的标识符 把这三个参数与其在本地的默认值定义在gradle.properties中,然后在build.gradle变能引用。 本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1965268,如需转载请自行联系原作者

优秀的个人博客,低调大师

安卓,文件存储

文件存储 layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Type something here" /> </LinearLayout> main package demo.jq.com.filepersistencetest; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.widget.EditText; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import static java.lang.System.out; /** * @author Jim */ public class MainActivity extends AppCompatActivity { private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit = (EditText) findViewById(R.id.edit); String inputText = load(); if (!TextUtils.isEmpty(inputText)) { edit.setText(inputText); edit.setSelection(inputText.length()); Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); String inputText = edit.getText().toString(); save(inputText); } public void save(String inputText) { FileOutputStream out = null; BufferedWriter writer= null; try { out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } } public String load() { FileInputStream in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try { in = openFileInput("data"); reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { content.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return content.toString(); } } 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7693256.html如需转载请自行联系原作者

优秀的个人博客,低调大师

安卓播放视频

播放视频 1.页面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/play" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Play" /> <Button android:id="@+id/pause" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Pause" /> <Button android:id="@+id/replay" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="Replay" /> </LinearLayout> <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 2.配置权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 3.功能实现 package demo.jq.com.playvideotest; import android.content.pm.PackageManager; import android.net.Uri; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import android.widget.VideoView; /** * @author jim */ public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private VideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = (VideoView) findViewById(R.id.video_view); Button play = (Button) findViewById(R.id.play); Button pause = (Button) findViewById(R.id.pause); Button replay = (Button) findViewById(R.id.replay); play.setOnClickListener(this); pause.setOnClickListener(this); replay.setOnClickListener(this); if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},1); } else { initVideoPath(); } } private void initVideoPath() { try { Uri uri = Uri.parse("android.resource://demo.jq.com.playvideotest/"+R.raw.video); videoView.setVideoURI(uri); } catch (Exception e) { e.printStackTrace(); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initVideoPath(); } else { Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show(); finish(); } break; default: } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.play: if (!videoView.isPlaying()) { videoView.start(); } break; case R.id.pause: if (videoView.isPlaying()) { videoView.pause(); } break; case R.id.replay: if (videoView.isPlaying()) { videoView.seekTo(0); videoView.resume(); } break; default: break; } } @Override public void onDestroy() { super.onDestroy(); if (videoView != null) { videoView.suspend(); } } } 真的可以播放哦,视频资源放在raw目录下了。 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7705051.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

重拾安卓_01_安卓开发环境搭建(eclipse)

一、下载安装Android SDK 1.下载地址 (1)官网(可FQ选择):http://developer.android.com/sdk/index.html (2)不可FQ选择:http://www.androiddevtools.cn/ 2.下载过程记录 这里选择第二种方式,进入http://www.androiddevtools.cn/,点击导航栏 Android SDK 工具 -> SDK Tools,选择一个版本进行安装,这里选择的是第二个版本(考虑可能最新版会不稳定)进行下载。 2.安装 二、参考资料 1.搭建Android开发环境——Eclipse

优秀的个人博客,低调大师

ChromeOS 逐渐“安卓化”

谷歌在博客透露称,ChromeOS 底层将更广泛地与 Android 共用同样的技术栈。 一个相关的例子是,ChromeOS 之前一直使用自己的蓝牙协议栈,而现在已经转用 Android 的蓝牙协议栈。这种转换(从 Bluez 到 Fluoride)不仅提升了配对速度,还提高了蓝牙配对成功率和重连率。 谷歌认为这一变化有助于“手机和配件等不同设备更好地与 Chromebook 协同工作”。以蓝牙协议栈为例,大多数配件都是针对 Android 和移动设备而非 Chromebook 进行测试的。ChromeOS 的切换可以让笔记本电脑从现有的移动支持中受益。 谷歌还说道: 为了继续以更快、更大规模的方式向用户推出新的 Google AI 功能,我们将采用部分 Android 堆栈(例如 Android Linux 内核和 Android 框架)作为 ChromeOS 基础的一部分。 将基于 Android 的技术栈引入 ChromeOS 将使我们能够加快 ChromeOS 核心的 AI 创新步伐,简化工程工作,并帮助手机和配件等不同设备更好地与 Chromebook 配合使用。 由此可见,谷歌做出这一转变有几个原因,包括提高开发效率以及帮助手机和配件与 Chromebook 更好地兼容。但更重要的是,这能加速在 Chromebook 平台上启用更多的 AI 功能与工具。 考虑到除搜索、G Suite 和 Gmail 之外,对于大部份用户而言,Android 设备是他们与谷歌 AI 产品互动最频繁的设备。因此谷歌将 AI 开发的重心放在 Android 上也就不足为奇。如果 ChromeOS 也能转变为和 Android 共用同样的底层技术,那么将 AI 功能和工具移植到 ChromeOS 上的技术难度与开发成本将大幅下降。 但大家也不用期待很快就能在 Chromebook 上看到这项工作的成果。谷歌表示,虽然更换 ChromeOS 底层技术的相关开发工作已经开始,但更新「在相当长的时间内都还不会面向消费者推出」。一旦重大改动的 ChromeOS 准备就绪,谷歌承诺将带来「无缝」的过渡体验。 相关阅读:谷歌展示在 Android 虚拟机中运行 ChromeOS

优秀的个人博客,低调大师

安卓使用LocationManager定位

版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/78030105 git地址 https://github.com/yayaa/LocationManager 安装 在gradle里边添加 compile 'com.yayandroid:LocationManager:2.0.4' AndroidManifest.xml权限添加 <!-- Required to check whether user has network connection or not --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- Dangerous Permissions --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 添加presenterX类 package online.geekgalaxy.layoutlearn; /** * Created by jailman on 2017/9/19. */ import android.location.Location; import android.text.TextUtils; import com.yayandroid.locationmanager.constants.FailType; import com.yayandroid.locationmanager.constants.ProcessType; public class presenter { private SampleView sampleView; public presenter(SampleView view) { this.sampleView = view; } public void destroy() { sampleView = null; } public void onLocationChanged(Location location) { sampleView.dismissProgress(); setText(location); } public void onLocationFailed(@FailType int failType) { sampleView.dismissProgress(); switch (failType) { case FailType.TIMEOUT: { sampleView.setText("Couldn't get location, and timeout!"); break; } case FailType.PERMISSION_DENIED: { sampleView.setText("Couldn't get location, because user didn't give permission!"); break; } case FailType.NETWORK_NOT_AVAILABLE: { sampleView.setText("Couldn't get location, because network is not accessible!"); break; } case FailType.GOOGLE_PLAY_SERVICES_NOT_AVAILABLE: { sampleView.setText("Couldn't get location, because Google Play Services not available!"); break; } case FailType.GOOGLE_PLAY_SERVICES_CONNECTION_FAIL: { sampleView.setText("Couldn't get location, because Google Play Services connection failed!"); break; } case FailType.GOOGLE_PLAY_SERVICES_SETTINGS_DIALOG: { sampleView.setText("Couldn't display settingsApi dialog!"); break; } case FailType.GOOGLE_PLAY_SERVICES_SETTINGS_DENIED: { sampleView.setText("Couldn't get location, because user didn't activate providers via settingsApi!"); break; } case FailType.VIEW_DETACHED: { sampleView.setText("Couldn't get location, because in the process view was detached!"); break; } case FailType.VIEW_NOT_REQUIRED_TYPE: { sampleView.setText("Couldn't get location, " + "because view wasn't sufficient enough to fulfill given configuration!"); break; } case FailType.UNKNOWN: { sampleView.setText("Ops! Something went wrong!"); break; } } } public void onProcessTypeChanged(@ProcessType int newProcess) { switch (newProcess) { case ProcessType.GETTING_LOCATION_FROM_GOOGLE_PLAY_SERVICES: { sampleView.updateProgress("Getting Location from Google Play Services..."); break; } case ProcessType.GETTING_LOCATION_FROM_GPS_PROVIDER: { sampleView.updateProgress("Getting Location from GPS..."); break; } case ProcessType.GETTING_LOCATION_FROM_NETWORK_PROVIDER: { sampleView.updateProgress("Getting Location from Network..."); break; } case ProcessType.ASKING_PERMISSIONS: case ProcessType.GETTING_LOCATION_FROM_CUSTOM_PROVIDER: // Ignored break; } } private void setText(Location location) { String appendValue = location.getLatitude() + ", " + location.getLongitude() + "\n"; String newValue; CharSequence current = sampleView.getText(); if (!TextUtils.isEmpty(current)) { newValue = current + appendValue; } else { newValue = appendValue; } sampleView.setText(newValue); } public interface SampleView { String getText(); void setText(String text); void updateProgress(String text); void dismissProgress(); } } 操作view显示坐标的类 package online.geekgalaxy.layoutlearn; import android.app.ProgressDialog; import android.location.Location; import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.TextView; import com.yayandroid.locationmanager.base.LocationBaseActivity; import com.yayandroid.locationmanager.configuration.Configurations; import com.yayandroid.locationmanager.configuration.LocationConfiguration; import com.yayandroid.locationmanager.constants.FailType; import com.yayandroid.locationmanager.constants.ProcessType; /** * Created by jailman on 2017/9/19. */ public class location extends LocationBaseActivity implements presenter.SampleView { private ProgressDialog progressDialog; private TextView locationText; private presenter Presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.location); final Button locate = (Button) findViewById(R.id.button6); locate.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { locationText = (TextView) findViewById(R.id.textView); Presenter = new presenter(location.this); getLocation(); } }); } @Override protected void onDestroy() { super.onDestroy(); Presenter.destroy(); } @Override public LocationConfiguration getLocationConfiguration() { return Configurations.defaultConfiguration("Gimme the permission!", "Would you mind to turn GPS on?"); } @Override public void onLocationChanged(Location location) { Presenter.onLocationChanged(location); } @Override public void onLocationFailed(@FailType int failType) { Presenter.onLocationFailed(failType); } @Override public void onProcessTypeChanged(@ProcessType int processType) { Presenter.onProcessTypeChanged(processType); } @Override protected void onResume() { super.onResume(); if (getLocationManager().isWaitingForLocation() && !getLocationManager().isAnyDialogShowing()) { displayProgress(); } } @Override protected void onPause() { super.onPause(); dismissProgress(); } private void displayProgress() { if (progressDialog == null) { progressDialog = new ProgressDialog(this); progressDialog.getWindow().addFlags(Window.FEATURE_NO_TITLE); progressDialog.setMessage("Getting location..."); } if (!progressDialog.isShowing()) { progressDialog.show(); } } @Override public String getText() { return locationText.getText().toString(); } @Override public void setText(String text) { locationText.setText(text); } @Override public void updateProgress(String text) { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.setMessage(text); } } @Override public void dismissProgress() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } } } view <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg3"> <TextView android:id="@+id/textView" android:layout_width="261dp" android:layout_height="137dp" android:layout_marginBottom="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="8dp" android:text="位置信息" android:textAlignment="center" android:textColor="@android:color/holo_red_dark" android:textSize="18sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/button6" app:layout_constraintHorizontal_bias="0.504" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.637" /> <Button android:id="@+id/button6" android:layout_width="138dp" android:layout_height="75dp" android:layout_marginBottom="156dp" android:layout_marginLeft="16dp" android:layout_marginRight="8dp" android:background="@android:drawable/btn_default" android:backgroundTint="@android:color/holo_orange_dark" android:text="locate" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="0.481" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> </android.support.constraint.ConstraintLayout>

优秀的个人博客,低调大师

安卓播放音频

播放音频 1.设置界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/play" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Play" /> <Button android:id="@+id/pause" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Pause" /> <Button android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Stop" /> </LinearLayout> 2.配置权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="demo.jq.com.playaudiotest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </manifest> 3.实现功能 package demo.jq.com.playaudiotest; import android.content.pm.PackageManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.os.EnvironmentCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File; import java.util.jar.Manifest; /** * @author jim * implements View.OnClickListener 继承接口 */ public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private MediaPlayer mediaPlayer = new MediaPlayer(); private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button play = (Button) findViewById(R.id.play); Button pause = (Button) findViewById(R.id.pause); Button stop = (Button) findViewById(R.id.stop); play.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},1); } else { initMediaPlayer(); } } private void initMediaPlayer() { try { Uri setDataSourceuri = Uri.parse("android.resource://demo.jq.com.playaudiotest/"+R.raw.music); mediaPlayer.setDataSource(this,setDataSourceuri); mediaPlayer.prepare(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initMediaPlayer(); } else { Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show(); finish(); } break; default: } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.play: if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } break; case R.id.pause: if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } break; case R.id.stop: if (mediaPlayer.isPlaying()) { mediaPlayer.reset(); initMediaPlayer(); } break; default: break; } } @Override public void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); } } } 这里有个关键就是获取音频文件的地址。 有几种情况,一种是播放sd卡,一种是播放应用中的音频,一种是播放在线的。 上面的案例是播放应用中的。 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7704772.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Sqlbean 安卓版 1.1.0 发布

Sqlbean是一款使用Java面向对象思想来编写并生成Sql语句的工具,在此基础上对Android SQLite实现轻量级插件支持。其中内置大量常用SQL执行的方法,可以非常方便的达到你想要的目的,相对复杂的SQL语句也得以支持,在常规的项目开发几乎做到不写SQL,可以有效的提高项目开发的效率,让开发者更专注于业务代码的编写。 🚀特点: 零入侵, 自动建表, 连表查询, 乐观锁,分页 💻环境: Android 4.0+ Sqlbean-Core与Java-Spring版请移步这里👉gitee,github 本次更新 1:优化生成的id以及自动生成的插入时间和更新时间注入到bean实体中; 2:重构简单条件,旧的where条件相关方法标识为过期,未来版本将会删除; 3:修改常量类生成由命名开头改为以命名开头改为以结尾(因为$开头开发工具无法提示); 4:更新pom依赖; 5:修复一些问题;

优秀的个人博客,低调大师

安卓to鸿蒙系列:ButterKnife(一)

目录: 1、基础知识 2、写一个乞丐版的ButterKnife 3、总结 本文是关于ButterKnife的移植的第一篇: 先介绍基础知识,理解apt是什么,最终输出一个乞丐版BufferKnife注入工具。 这是读懂BufferKnife源码的基础。 第二篇占坑:具体讲解BufferKnife的移植。 基础知识 apt技术的实际应用: Android Databinding绑定view ButterKnife绑定view Dagger2注入变量 ARouter生成路由表 真的好多,很重要。apt就是生产力工具! 什么是apt? 通俗讲:apt就是javac对外开放的一个插件,使javac在编译期间获取注解(Annotation),并做出相应的处理(多数都是生成一些java代码)。 从上图可以看出apt处理的是 java源文件 ,在编译期介入。 与之对比的是asm之类的工具,处理的是字节码文件,在编译后期介入。 apt与javac的约定 apt与javac约定在META-INF/services/javax.annotation.processing.Processor文件中注册apt插件。这样apt就参与到javac的编译过程中了。 写一个乞丐版BufferKnife 不想看文字,直接看源码,点击 https://gitee.com/andych008/aptDemo 初始代码fork自 https://github.com/LiMubai2017/aptDemo ,先对作者表示感谢。 乞丐版BufferKnife作为一款view注入工具,主要干了3件事, 解析注解 处理注解(生成模板类文件) 通过模板类注入view对象 第0步:准备工作 先定义注解BindView,被@BindView标记的变量会被注入。 一般注解都定义在一个单独的module(如取名apt-annotation),因为它会被apt-compiler和apt-api都依赖,属于公共代码。 apt-compiler是apt的主要代码所在,完成注解的解析、模板文件的生成。 apt-api则是对外的工具类,供用户使用,完成注入操作。 app是demo,其中定义了 @BindView(value = ResourceTable.Id_text_helloworld) public Text testTextView; 第一步:解析注解 在apt-compiler中定义类BindViewProcessor继承javax.annotation.processing.AbstractProcessor,实现其中的getSupportedAnnotationTypes()该方法注册要解析的注解。 第二步:处理注解(生成模板文件) 在BindViewProcessor中实现process()方法,处理注解。 先理解javax.lang.model.element.Element和javax.lang.model.type.TypeMirror,参考这里 有详细的解释。 简单讲: Element是描述java语言元素的类,比如包、类、变量、参数等。 TypeMirror是描述Element类型的类,比如各种基本类型、数组、类等。 很绕,只有多用才能真正理解。比如:demo中testTextView就是VariableElement元素类型 TypeElement enclosingElement = (TypeElement) variableElement.getEnclosingElement();//获取代表MainAbility的TypeElement String field = variableElement.getSimpleName().toString();//testTextView TypeMirror typeMirror = variableElement.asType();//ohos.agp.components.Text 通过log()方法,可以使用Messager打日志,验证我们的理解。 log(String.format("element : (%s) %s ", element.getKind(), element)); log(String.format("bind : (%s) %s <--> id = %d", typeMirror, field, id)); 输出日志: 注: element : (FIELD) testTextView 注: bind : (ohos.agp.components.Text) testTextView <--> id = 16777222 generateCodeByPoet()方法中,使用javapoet生成模板代码MainAbility$$Autobind.java(文件路径app/build/generated/source/annotation/debug/com/example/apt_demo/MainAbility$$Autobind.java) 关于javapoet的使用,直接看官方文档吧:https://github.com/square/javapoet 解释一下下面这段代码,让大家对javapoet有一直观的认识 MethodSpec.Builder injectMethod = MethodSpec.methodBuilder("inject")//生成一个方法,方法名是inject .addAnnotation(Override.class)//给方法加上"Override.class"注解 .addModifiers(Modifier.PUBLIC)//给方法加上访问控制符 .addParameter(Object.class, "target")//给方法加上参数 .addStatement("$T substitute = ($T)target", className, className);//在方法体内定义一条语名 上面的代码生成下面的代码(我用java代码生成java代码,这就是javapoet干的事情): @Override public void inject(Object target) { MainAbility substitute = (MainAbility)target; } 看完上面这一坨,你如果觉得难。请用JavaWriter生成java文件。你就会觉得javapoet真香。 第三步:通过模板类注入view对象 在apt-api中,我们定义一个AutoBind.java类封装对模板类MainAbility$$Autobind.java的操作。 按照模板类的命名规则xxx$$Autobind,通过反射实例化出MainAbility$$Autobind.java,调用 其中的inject方法,完成view的注入。 总结 apt只是一个工具,在这套工具框架下,怎么处理注解才是难点。 BufferKnife和我们的“乞丐版BufferKnife”本质上没有区别。除了注入view,还支持事件绑定、增量编译。 作者:没用的喵叔 想了解更多内容,请访问51CTO和华为合作共建的鸿蒙社区:https://harmonyos.51cto.com

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册