求:android 获取系统相册图片并显示在当前页面的代码

求:android 获取系统相册图片并显示在当前页面的代码,第1张

先初始化;

注意自定义 的

private final String IMAGE_TYPE = "image/";private final int IMAGE_CODE = 0;

private void setImage() {

Intent getAlbum = new Intent(IntentACTION_GET_CONTENT);    getAlbumsetType(IMAGE_TYPE);    startActivityForResult(getAlbum, IMAGE_CODE);}

这里使用Intent获得相册数据,并返回原来界面;

这里说明一下

startActivityForResult(getAlbum, IMAGE_CODE);

补充{

startActivityForResult与startActivity的不同之处在于:

1、startActivity( ) 

仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

2、startActivityForResult( ) 

可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

}

startActivityForResult(getAlbum, IMAGE_CODE);

这里采用startActivityForResult来做跳转,此处的IMAGE_CODE实质是0为一个依据,可以写其他的值,但一定要>=0

然后重写onActivityResult用于接收刚刚得到的数据

protected  void onActivityResult(int requestCode, int resultCode, Intent data) {

Bitmap bm = null;    ContentResolver resolver = getContentResolver();    if (requestCode == IMAGE_CODE) {        try {

Uri originalUri = datagetData();            bm = MediaStoreImagesMediagetBitmap(resolver, originalUri);            imgShowsetImageBitmap(bm);        } catch (IOException e) {

eprintStackTrace();        }

}

补充{

ContentProvider-----数据提供给第三方应用程序使用时使用

因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其他应用程序的数据。如果你想公开你自己的数据,你有两个选择:你可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限

}

这里是创建一个新的内容提供器,然后在Activity当中通过getContentResolver()可以得到当前应用的 ContentResolver实例

if (requestCode == IMAGE_CODE) {

resultCode为回传的标记这句话是在确认是否回传的是你所需要的;如果是就执行try;不然就执行catch (IOException e) {

eprintStackTrace();}先说这里当try语句中出现异常是时,会执行catch中的语句,IOException e也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了eprintStackTrace() ;。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。

try {

Uri originalUri = datagetData();    bm = MediaStoreImagesMediagetBitmap(resolver, originalUri);    imgShowsetImageBitmap(bm);接收数据处理数据并显示照片。

然后进行测试。

另附源码:

MainActivity:

package comexampleadministratormyapplication1;import androidgraphicsBitmapFactory;import androidsupportv7appAppCompatActivity;import androidosBundle;import javaioIOException;import androidnetUri;import androidosBundle;import androidproviderMediaStore;import androidappActivity;import androidcontentContentResolver;import androidcontentIntent;import androidgraphicsBitmap;import androidviewView;import androidviewViewOnClickListener;import androidwidgetButton;import androidwidgetImageView;public class MainActivity extends AppCompatActivity {    private final String IMAGE_TYPE = "image/";    private final int IMAGE_CODE = 0;    private Button choose=null;    private ImageView imgShow;    @Override    protected void onCreate(Bundle savedInstanceState) {        superonCreate(savedInstanceState);        setContentView(Rlayoutactivity_main);        init();}    private void init() {       choose=(Button) findViewById(Ridbutton1);        imgShow=(ImageView) findViewById(RidimgShow);        choosesetOnClickListener(listener);    }    private OnClickListener listener=new OnClickListener(){        @Override        public void onClick(View v) {

setImage();            }

};        private void setImage() {

Intent getAlbum = new Intent(IntentACTION_GET_CONTENT);            getAlbumsetType(IMAGE_TYPE);            startActivityForResult(getAlbum, IMAGE_CODE);        }    protected  void onActivityResult(int requestCode, int resultCode, Intent data) {

Bitmap bm = null;        ContentResolver resolver = getContentResolver();        if (requestCode == IMAGE_CODE) {            try {

Uri originalUri = datagetData();                bm = MediaStoreImagesMediagetBitmap(resolver, originalUri);                imgShowsetImageBitmap(bm);            } catch (IOException e) {

eprintStackTrace();            }

}

}

}

layout:activity_mainxml:

<xml version="10" encoding="utf-8"><LinearLayout xmlns:android=">

该功能主要实现上传到服务器,选择的方式有两种,一种是从手机相册中选择,另一种是调用手机摄像头拍照。

1从相册选择的会存储到 data 里面,而相机拍照的不会存储到 data 里面。

2由于从相册选择的会存储到 data 里面,而相机拍照的不会存储到 data 里面,所以在获取资源进行回显的方式不同,请看一下详细代码:(一定要创建文件 createFileName())。

xamarin怎样获取android外卡路径

一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到 EnvironmentgetExternalStorageDirectory()这个结点。

此时,调用EnvironmentgetExternalStorageDirectory(),则返回外置的SD的路径。

android 怎样动态的获取sd卡路径

链接电脑USB调试情况下,在电脑上有新的磁盘显示,一个SD的,一个手机的,打开SD的就可以找各文件夹路径

Android怎样获取外部存储器路径

读写sdcard上的文件

其中读写步骤按如下进行:

1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true

EnvironmentgetExternalStorageState()equals(EnvironmentMEDIA_MOUNTED)

2、调用EnvironmentgetExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录

3、使用IO流 *** 作SD卡上的文件

注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡

必须在AndroidManifestxml上配置读写SD卡的权限

<uses-permission android:name="androidpermissionMOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>

我怎样才能获得外部SD卡路径为Android 40 +

1 我想你需要这个外部SD卡:

new File("/mnt/external_sd/")

new File("/mnt/extSdCard/")

你的情况

在更换EnvironmentgetExternalStorageDirectory()您的作品,应在MNT目录优先和工作在那里检查什么

你键入选择哪个SD卡

File storageDir = new File("/mnt/");

if(storageDirisDirectory()){

String[] dirList = storageDirlist();

TODO some type of selecton method

}

怎样获取class路径

import javaioFile;

public class FileTest {

public static void main(String[] args) throws Exception {

Systemoutprintln(ThreadcurrentThread()getContextClassLoader()

getResource(""));

Systemoutprintln(FileTestclassgetClassLoader()getResource(""));

Systemoutprintln(ClassLoadergetSystemResource(""));

Systemoutprintln(FileTestclassgetResource(""));

Systemoutprintln(FileTestclassgetResource("/"));

 Class文件所在路径

Systemoutprintln(new File("/")getAbsolutePath());

Systemoutprintln(SystemgetProperty("userdir"));

Systemoutprintln(SystemgetProperty("fileencoding"));

}

}

android 怎么获取相册路径

android手机42版本之前是一个方法,大于42版本又是一个方法。

注意:现在手机市场android版本2015面上半年平均44,现在是平均50了。

before

你百度一下,都能查到,很简单

after

private void startPickPhotoActivity() {

    Intent intent = new Intent(IntentACTION_OPEN_DOCUMENT);

    intentsetType("image/"); Or 'image/ jpeg '

    startActivityForResult(intent, RESULT_PICK_PHOTO_NORMAL);

    }

获得返回的路径

    @Override

    protected void onActivityResult(int requestCode, int resultCode,

        Intent data) {

    if (requestCode == RESULT_PICK_PHOTO_NORMAL) {

        if (resultCode == RESULT_OK && data != null) {

选中路径

mFileName = MainActivitygetPath(getApplicationContext(),

            datagetData());

        if (""equals(mFileName)) {

            return;

        }

        Intent intent = new Intent(this, EditActivityclass);

        intentputExtra("pathName", mFileName);

        startActivity(intent);

        }

    }

    }

    @TargetApi(BuildVERSION_CODESKITKAT)

    public static String getPath(final Context context, final Uri uri) {

    final boolean isKitKat = BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT;

     DocumentProvider

    if (isKitKat && DocumentsContractisDocumentUri(context, uri)) {

        ExternalStorageProvider

        if (UriUtilsisExternalStorageDocument(uri)) {

        final String docId = DocumentsContractgetDocumentId(uri);

        final String[] split = docIdsplit(":");

        final String type = split[0];

        if ("primary"equalsIgnoreCase(type)) {

            return EnvironmentgetExternalStorageDirectory() + "/"

                + split[1];

        }

        }

        DownloadsProvider

        else if (UriUtilsisDownloadsDocument(uri)) {

        final String id = DocumentsContractgetDocumentId(uri);

        final Uri contentUri = ContentUriswithAppendedId(

            Uriparse("content:downloads/public_downloads"),

            LongvalueOf(id));

        return UriUtilsgetDataColumn(context, contentUri, null, null);

        }

        MediaProvider

        else if (UriUtilsisMediaDocument(uri)) {

        final String docId = DocumentsContractgetDocumentId(uri);

        final String[] split = docIdsplit(":");

        final String type = split[0];

        Uri contentUri = null;

        if ("image"equals(type)) {

            contentUri = MediaStoreImagesMediaEXTERNAL_CONTENT_URI;

        } else if ("video"equals(type)) {

            contentUri = MediaStoreVideoMediaEXTERNAL_CONTENT_URI;

        } else if ("audio"equals(type)) {

            contentUri = MediaStoreAudioMediaEXTERNAL_CONTENT_URI;

        }

        final String selection = MediaColumns_ID + "=";

        final String[] selectionArgs = new String[] { split[1] };

        return UriUtilsgetDataColumn(context, contentUri, selection,

            selectionArgs);

        }

    }

     MediaStore (and general)

    else if ("content"equalsIgnoreCase(urigetScheme())) {

        Return the remote address

        if (UriUtilsisGooglePhotosUri(uri))

        return urigetLastPathSegment();

        return UriUtilsgetDataColumn(context, uri, null, null);

    }

     File

    else if ("file"equalsIgnoreCase(urigetScheme())) {

        return urigetPath();

    }

    return null;

    }

如何获取android sdcard路径

EnvironmentgetExternalStorageDirectory()

android怎么获取U盘路径

用Re管理器进入/mnt/目录一个一个找

android怎么获取分区路径

我们可以在adb中使用df 来查看分区情况。

1、跨分区不能用 MV命令来拷贝。但是可以用CP命令。如PWD,当前目录为:/data/local/tmp 。

此目录下有个busybox和1txt文件。则利用CP命令拷贝如下:/busybox cp1txt /system

2、Android的用户组有 System, root, shell

3、怎么样才能 *** 作分区。

分区 *** 作是需要权限的。一般来说System分区的权限限制得比较严,Data分区限制比较严,用户可以 *** 作的目录有local,app目录。比如/data/local/tmp

data分区常用目录:app , system , data ,local,misc 其中system,local可以进入并使用ls等命令。data,app可以进入,但不能用ls命令。

data/data目录:存放的是所有APK程序数据的目录,每个APK对就一个自己的Data目录,就是在data/data/目录下,会产生一个跟Package一样的目录。如有一个APK,它的包名叫testhello则,在data/data/目录下会有一个testhello的目录,这个APK只能 *** 作此目录,不能 *** 作其它APK的目录这个在LINUX下叫做用户进程只能 *** 作自己的进程目录

data/app目录:用户安装的APK放在这里。我们如果把APK放入这个文件夹下面的话,就算安装好了。这就叫静默安装。不用管APK文件里面的lib目录下的库文件,系统会自动帮我们放入调用库的。

data/system目录下面有packagesxml ,packageslist,appwidgetsxml, 等等一些记录手机安装的软件,Widget等信息。

data/misc目录:保存WIFI帐号,***设置信息等。如保存了一个WIFI连接帐号,则此目录下的WIFI目录下面可以查看到。

system分区常用目录: app , lib, xbin, bin , media,framework

system/app目录:存放系统自带的APK。没有测试过是否将APK放入到System/app目录下,也是静默安装APK。?

system/lib目录:存放APK程序用到的库文件。

system/bin目录和system/xbin目录:存放的是shell命令。

system/framework目录:启用Android系统所用到框架,如一些jar文件。

4 Android下面的目录都是有权限的,要 *** 作目录都需要有此权限才能 *** 作,如果没有,则使用chomd777来修改如果是分区根目录,如/data分区, /system分区都没有权限,则需要重新挂载 使用 mount -oremount XX

CaptureScreen可以进行截屏 *** 作,保存为指定文件名的ApplicationCaptureScreenshot(string filename)比如ApplicationCaptureScreenshot(“1png”);然后用>

这里只介绍按下“保存”后如何将一个Bitmap对象保存为文件的执行步骤,对的下载,到Bitmap对象的转换,Bitmap对象的格式转换和压缩,以及界面设计部分全部都忽略了。

确定存储路径

获取外部存储权限

确定外部存储状态

确定文件名

保存到文件中

发送广播,通知系统扫描保存后的文件

确定存储路径

在Android中文件存储路径包括内部存储和外部存储两种类型。

对内部存储,当一个app被安装到手机后,Android系统会在内部存储的/data/data/目录下创建一个以包名称命名的文件夹。例如/data/data/comsohuinputmethodsogou/。一个应用对内部存储的所有访问都被限制在这个文件夹中,也就是说Android应用只能在该目录中读取,创建,修改文件。对该目录之外的其他内部存储中的目录都没有任何 *** 作的权限。因此,如果将保存在内部存储中,只能被应用自身读取,其他应用均无法读取。如果需要让系统图库,相册或其他应用能够找到保存的,必须将保存到外部存储中。

对外部存储,当一个app被安装到手机后,Android系统会在外部存储的/Android/data/目录下创建一个以包名命名的文件夹(这里第一个/不是根路径,而是相对外部存储所挂载路径的相对路径)。例如/storage/emulated/0/Android/data/comsohuinputmethod/。这个路径同样只能被应用自身读取,其他应用不能访问。因此,也不能将保存在这个目录中。

除外部存储的/Android目录之外的其他目录一般都是可以被其他应用访问的。目前,大多数应用都会在外部存储的根路径下建立一个类似包名的多层目录,以存储需要共享的文件。例如/storage/emulated/0/sogou/image/。还需要注意的是,很多查看的应用都支持按照文件夹来查看。如果将所在的文件夹取名为image,photo之类的,就无法和其他文件夹区分开,用户也不能识别该文件夹的用途。因此最好取一个有区分度的文件夹名字,例如百度贴吧就保存在/tieba目录,微信是保存在/tencent/MicroMsg/WeiXin目录。

由于Android系统的碎片化问题,不同设备上外部存储的路径很可能会不同,因此,不能直接使用/storage/emulated/0/作为外部存储的根路径。

Android SDK中 Environment类 提供了getExternalStorageDirectory()方法来获取外部存储的根路径。示例如下:

[java] view plain copy

String dir = EnvironmentgetExternalStorageDirectory()getAbsolutePath() + "/tencent/MicroMsg/WeiXin/"

需要注意的是EnvironmentgetExternalStorageDirectory()返回的路径中最后一个字符不是/,如果需要创建子目录,需要在子目录的前后都加上/。

获取外部存储权限

由于需要在外部存储中写文件,需要在AndroidManifestxml中增加如下的权限声明。

[java] view plain copy

<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>

确定外部存储状态

由于外部存储需要被挂载,也可以被卸载,在写入文件之前,需要先判断外部存储的状态是否正常。只有状态正常情况下才可以执行保存文件的 *** 作。获取外部存储状态同样是通过Environment类,通过EnvironmentgetExternalStorageState()可以得到一个字符串,来表示外部存储的状态。同时在Environment类中定义了一系列的String常量表示不同的状态。在所有的状态中只有内部存储处于EnvironmentMEDIA_MOUNTED状态时才可以读写文件,因此,需要将获取到的状态和EnvironmentMEDIA_MOUNTED做比较,如果不是EnvironmentMEDIA_MOUNTED状态,就返回保存失败。示例如下。

[java] view plain copy

//获取内部存储状态

String state = EnvironmentgetExternalStorageState();

//如果状态不是mounted,无法读写

if (!stateequals(EnvironmentMEDIA_MOUNTED)) {

return;

}

确定文件名

保存的文件名可以由应用根据自身需要自行确定,一般来说需要有一个命名规则,然后根据命名规则计算得到文件名。

这里列举几种常见的命名规则。

随机命名

这种命名规则是随机生成一个字符串或一组数字来对命名。

字符串可以通过UUID来生成,数字可以通过Random()类来生成,例如:

[java] view plain copy

//通过UUID生成字符串文件名

String fileName1 = UUIDrandomUUID()toString();

//通过Random()类生成数组命名

Random random = new Random();

String fileName2 = StringvalueOf(randomnextInt(IntegerMAX_VALUE));

这种命名规则是按照数字从小到大的顺序来对命名。

在程序启动时先获取文件名中当前最大数字的文件名,之后每保存一张就将数字加1即可。

时间命名

这种命名规则是根据保存的当前系统时间来对命名。

系统时间可以通过SystemcurrentTimeMillis()来获取,不过SystemcurrentTimeMillis()获取到的时间是一个long型的整数,如果用它做文件名,无法通过文件名直接看出文件的具体保存时间。可以通过SimpleDateFormat先对当前时间做格式化,然后再将其作为文件名来使用。例如:

[java] view plain copy

使用这种命名规则来命名需要注意的是同一秒钟可能会有多张需要保存,在得到当前系统时间对应的文件名后,需要判断该文件是否存在。如果文件已经存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名后加上一个随机数后缀,或者是用毫秒数做后缀。

Calendar now = new GregorianCalendar();

SimpleDateFormat simpleDate = new SimpleDateFormat("yyyyMMddHHmmss", LocalegetDefault());

String fileName = simpleDateformat(nowgetTime());

文件URL命名

每张网络都有一个对应的URL,可以根据的URL来对命名。

不过URL中会包含一些不能用作文件名的特殊字符,此外直接用URL来命名可能会带来安全问题。为了避免这两个问题,可以将URL的MD5值作为文件名来使用。由于MD5是不可逆的,也就无法通过MD5值反向得到URL,同时MD5值对应的字符串只包含[0-9A-Z],不包含特殊字符,可是作为文件名使用。

由于每张的URL是唯一的,其对应的文件名也就是唯一的。如果需要每张网络只能生成一个文件,不允许保存为多份拷贝,可以用这种命名规则。在得到URL对应的文件名后,先判断文件是否已经存在,如果已经存在,直接覆盖或不处理。

保存到文件中

保存文件时,通过Bitmap的compress()方法将Bitmap对象压缩到一个文件输出流中,然后flush()即可。示例如下。

[java] view plain copy

try {

File file = new File(dir + fileName + "jpg");

FileOutputStream out = new FileOutputStream(file);

mBitmapcompress(BitmapCompressFormatJPEG, 100, out);

outflush();

outclose();

} catch (Exception e) {

eprintStackTrace();

}

发送广播,通知系统扫描保存后的文件

至此,已经实现将Bitmap对象保存成外部存储中的一个jpg格式的文件。但此时该文件只是保存在外部存储的一个目录中,必须进入其所在的目录中才可以看到。在系统图库,相册和其他应用中无法看到新建的文件。为了让其他应用能够知道文件被创建,必须通知MediaProvider服务将新建的文件添加到数据库中。

Android系统中常驻一个MediaProvider服务,对应的进程名为androidprocessmedia,此服务用来管理本机上的媒体文件,提供媒体管理服务。在系统开机或者收到外部存储的挂载消息后,MediaProvider会调用MediaScanner,MediaScanner会扫描外部存储中的所有文件,根据文件类型的后缀将文件信息保存到对应的数据库中,供其他APP使用。

MediaScannerReceiver是一个广播接收者,当它接收到特定的广播请求后,就会去扫描指定的文件,并根据文件信息将其添加到数据库中。当文件被创建后,就可以发送广播给MediaScannerReceiver,通知其扫描新建的文件。示例如下。

[java] view plain copy

try {

File file = new File(dir + fileName + "jpg");

FileOutputStream out = new FileOutputStream(file);

mBitmapcompress(BitmapCompressFormatJPEG, 100, out);

outflush();

outclose();

//保存后发送广播通知更新数据库

Uri uri = UrifromFile(file);

sendBroadcast(new Intent(IntentACTION_MEDIA_SCANNER_SCAN_FILE, uri));

} catch (Exception e) {

eprintStackTrace();

}

的异步保存

保存文件时,如果很大,或需要同时保存多张时,就需要较多的时间。为了避免阻塞UI线程,出现帧率下降或ANR,通常需要将保存 *** 作放到线程中去执行。当保存完毕后通过sendMessage()方法通知UI线程保存结果。

将保存放到后台线程去执行需要增加一些同步机制避免一些多线程问题。例如有两张需要保存,分别放到两个线程中去执行,保存时文件名以数字顺序增加。第一个线程选中文件名为125jpg,但此时文件还未创建,第二个线程判断125jpg不存在,于是也选取125jpg作为文件名,两张就保存到同一个文件中了。

使用系统自带的浏览器应用程序Gallery可以打开一张指定的,

//使用Intent

Intent intent = new Intent(IntentACTION_VIEW);

//Uri mUri = Uriparse("file://" + picFilegetPath());Android30以后最好不要通过该方法,存在一些小Bug

intentsetDataAndType(UrifromFile(picFile), "image/");

startActivity(intent)

以上就是关于求:android 获取系统相册图片并显示在当前页面的代码全部的内容,包括:求:android 获取系统相册图片并显示在当前页面的代码、android保存图片成功后图库里却找不到图片、Android studio从相册里面选图片无法选中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9515244.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存